справка по ошибке LNK2019: неразрешенный внешний символ _WinMain @ 16, указанный в функции ___tmainCRTStartup - PullRequest
0 голосов
/ 02 мая 2011

Я недавно пришел к этой ошибке, я много искал, но не смог найти решение, я сделал консольное приложение win 32 (c ++) в Visual Studio 2010 и добавил 2 заголовочных файла и 1 .cpp файл с основной функцией. в нем я не изменил свойства проекта, ваша помощь будет очень признательна. вот мой код:

//listNode.h:
#ifndef LISTNODE_H

#define LISTNODE_H

template< typename item > class Node
{

private:

    item data;
    Node<item> *next;

public:

    Node( item d , Node<item> *n );
    void setData( item d );
    item getData();
    void setNext( Node *n );
    Node<item>* getNext();

};

template< typename item > 
    Node< item > :: Node( item d , Node *n )
    {
        data = d;
        next = n;
    }

    template< typename item>
    void Node< item > :: setData( item d )
    {
        data = d;
    }

    template< typename item>
    item Node< item > :: getData()
    {
        return data;
    }

    template< typename item >
    void Node< item > :: setNext( Node *n )
    {
        next = n;
    }

    template< typename item >
    Node<item>* Node<item> :: getNext()
    {
        return next;
    }

#endif  


//list:
#ifndef LIST_H
#define LIST_H

#include "listNode.h"

template < typename item > class List
{
private:

    Node<item> *first;
    Node<item> *last;
    int numberOfElements;

public:

    List( Node<item> *f , Node<item> *l , int num );
    ~List();
    void addFront( item d );
    void addRear( item d );
    void removeFront();
    void removeRear();
    item front();
    item rear();
    bool isEmpty();
    int size();
    void print();

};


template < typename item >
List<item> :: List( Node<item> *f , Node<item> *l , int num )
{
    first = f;
    last = l;
    numberOfElements = num;
}

template < typename item >
List<item> :: ~List()
{
    for( int i=0 ; i<nummerOfElements ; i++ )
    {
        Node<item> temp = *first;

        delete *first;

        first = temp.getNext();

    }

    first = 0;
    last = 0;
    numberOfElements = 0;
}



template < typename item >
void List<item> :: addFront( item d )
{
    Node<item> newNode( d , first );

    first = &newNode;

    numberOfElements++;
}

template < typename item >
void List<item> :: addRear( item d )
{
    Node<item> newNode;
    newNode.setData(d);

    if( numberOfElements != 0 )
        *last.setNext( &newNode );

    last = &newNode;

    numberOfElements++;
}


template < typename item >
void List<item> :: removeFront()
{
    if( numberOfElements != )
    {

        Node<item> temp = *first;

        delete *first;

        first = temp.getNext();

        delete temp;

        numberOfElements--;
    }

    else
        cout << "list is already empty!\n"
}

template < typename item >
void List<item> :: removeRear()
{
    if( numnerOfElements != 0 )
    {

        //finding the node before last : 

        Node<item> *beforeLast;

        beforeLast = first;

        while( true ) 
      {
          if( *beforeLast.getNext() == last )
              break;

          beforeLast = *beforeLast.getNext();
      }


        Node<item> temp = *last;

        delete *last;

        last = beforeLast;

        delete temp;

        numberOfElements--;
    }

    else
        cout<< "list is already empty!\n"
}

template < typename item >
item List<item> :: front()
{
    if( numberOfElements != 0 )
        return *first.getData();
    else
        return
        -1;
}

template < typename item >
item List<item> :: rear()
{
    if( numberOfElements != 0 )
        return *last.getData();
    else
        return -1;
}

template < typename item >
bool List<item> :: isEmpty()
{
    if( numberOfElements == 0 )
        true;
    else
        false;
}

template < typename item >
int List<item> :: size()
{
    return numberOfElements;
}



#endif


//main.cpp:

#include <string>
#include<iostream>

using namespace std;

#include "list.h"

template < typename item >
int main()
{
    string atom1("1");
    string atom2("2");
    string atom3("3");
    string atom4("5");
    string atom5("6");

    List<item> l1();

    l1.addRear( atom4 );
    l1.addRear( atom5 );

    List<item> l2();

    l2.addRear( atom1 );
    l2.addRear( atom2 );
    l2.addRear( atom3 );
    l2.addRear( l1 );

    cout << l2.front()


        return 0;
}

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

main - это специальная функция в C ++ - она ​​не может быть шаблоном. И если бы это было возможно, как бы вы предоставили тип (ы), на которые он создан? Я думаю, может быть, вы еще не совсем понимаете шаблоны.

Я только что проверил это, создав консольный проект VC ++ с main, который выглядит так:

template <typename T>
int main() {}

и я получаю именно то сообщение об ошибке ссылки, которое вы получаете, но нет ошибки компиляции (которая должна быть).

0 голосов
/ 02 мая 2011

ошибка LNK2019: неразрешенный внешний символ _WinMain @ 16, на который ссылается функция ___ tmainCRTStartup

Приложение Windows имеет ___tmainCRTStartup в качестве одной из функций CRT, запускаемых при запуске, которая вызывает вашОсновная функция WinMain иногда выражается как TWinMain для поддержки двойной компиляции ascii / widechar.

Для сравнения консольное приложение использует main

Вы пропустили WinMain Так что у вас есть либоневерный тип проекта или неправильный метод main.
Тогда уже описана проблема, что вы не можете использовать шаблон на main

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...