0

我正在实现一个简单的链接列表,但我不断收到 LNK2019 错误,我将代码简化到最低限度以跟踪问题,但我不断收到它。我正在使用 Visual Studio 2010。我的头文件是:

#ifndef __TSLinkedList__H__
#define __TSLinkedList__H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "LinkedNode.h"

template <class T>
class LinkedList
{
public:
LinkedList(void);
~LinkedList(void);
protected:
LinkedNode<T> * head;
};

实现文件为:

#include "StdAfx.h"
#include "LinkedList.h"

template <class T>
LinkedList<T>::LinkedList(void)
{
head = NULL;
}
template <class T>
LinkedList<T>::~LinkedList(void)
{
}

主要功能是:

#include "stdafx.h"
#include "stdlib.h"
#include "LinkedList.h"

int _tmain(int argc, _TCHAR* argv[])
{
LinkedList<int> mList;
system("PAUSE");
return 0;
} 

我收到了这个错误:

错误 1 ​​错误 LNK2019: símbolo externo "public: __thiscall LinkedList::~LinkedList(void)" (??1?$LinkedList@H@@QAE@XZ) in function _wmain

我得到与构造函数相同的错误。有趣的是它指向了_wmain,而我的main函数叫做_tmain。我已经尝试将子系统链接器从 /SUBSYSTEM:WINODWS 更改为 /SUBSYSTEM:CONSOLE,但它已经设置为 /SUBSYSTEM:CONSOLE。显然我的实现远不止于此,但我把它全部撕掉来跟踪这个问题。帮助wpuld被欣赏,这让我发疯。我是 C++ 新手。

4

2 回答 2

2

将函数实现移动到头文件。

为了生成专门化的代码,编译器必须具有可用于每个翻译单元的函数的定义。

#ifndef __TSLinkedList__H__
#define __TSLinkedList__H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "LinkedNode.h"
template <class T>
class LinkedList
{
public:
    LinkedList(void);
    ~LinkedList(void);
    protected:
    LinkedNode<T> * head;
};

template <class T>
LinkedList<T>::LinkedList(void)
{
head = NULL;
}
template <class T>
LinkedList<T>::~LinkedList(void)
{
}

#endif
于 2012-07-12T14:51:57.903 回答
0

编译器不会编译您的模板类成员定义,因为它们不包含在任何编译单元中。

但是,它确实看到使用了一些成员,因此它将为这些成员生成“未定义”符号。

然后是链接器,试图将未定义的符号与其中一个编译目标文件中定义的一些符号相匹配。

但是,LinkedList::~LinkedLis()析构函数尚未编译,因此它不在任何目标文件中,这就是链接器所抱怨的。

您可以通过以下方式解决此问题

  • 包括主源文件中的定义文件,
  • 或将定义粘贴到模板头文件中,
  • 或者包括模板头文件底部的模板实现文件(我最喜欢的)
于 2012-07-12T15:02:33.073 回答