繁体   English   中英

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

[英]help with error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

我最近遇到了这个错误,我搜索了很多但我找不到解决方案,我在 Visual Studio 2010 中制作了一个 win 32 控制台应用程序(c++),并添加了 2 个 header 文件和 1.cpp 文件,其中包含主要的 function,我没有更改项目的属性,非常感谢您的帮助。 这是我的代码:

//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;
}

main 是 C++ 中的特殊 function - 它不能是模板。 如果可以,您将如何提供模板化的类型? 我想也许你还不太了解模板。

我刚刚通过创建一个 VC++ 控制台项目来检查这一点,其主项目如下所示:

template <typename T>
int main() {}

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

错误 LNK2019:未解析的外部符号 _WinMain@16 在 function ___tmainCRTStartup 中引用

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

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

你缺少WinMain所以你要么是错误的项目类型,要么是错误的 main 方法。
然后是已经描述的问题, 您不能在 main 上使用模板

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM