帮助错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_WinMain @ 16

时间:2011-05-02 18:26:32

标签: c++ visual-studio-2010

我最近遇到了这个错误,我搜索了很多,但我找不到解决方案,我在visual studio 2010中创建了一个win 32控制台应用程序(c ++),并添加了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 个答案:

答案 0 :(得分:2)

main是C ++中的一个特殊功能 - 它不能是模板。如果可能的话,你会如何提供模板化的类型?我想也许你还不太了解模板。

我刚刚通过创建一个带有如下所示的main的VC ++控制台项目来检查这个:

template <typename T>
int main() {}

我得到了你得到的链接错误信息,但没有编译错误(应该有)。

答案 1 :(得分:0)

  

错误LNK2019:函数___ tmainCRTStartup中引用的未解析的外部符号_WinMain @ 16

Windows应用程序___tmainCRTStartup作为其在启动时运行的CRT函数之一,调用主函数WinMain有时表示为TWinMain以支持双编译ascii / widechar。

相比之下,控制台应用使用main

你遗失WinMain所以你有错误的项目类型或错误的主要方法 然后问题已经描述为you cannot use template on main