2012-07-12 48 views
0

我正在實現一個簡單的鏈接列表,但我不斷收到LNK2019錯誤,我簡化了我的代碼到最低限度來跟蹤問題,但我一直得到它。我使用Visual Studio 2010中我的頭文件是:錯誤LNK2019簡單的鏈接列表實現

#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ímboloexterno「public:__thiscall LinkedList ::〜LinkedList(void)」(?? 1?$ LinkedL ist @ H @@ QAE @ XZ)in _wmain

我得到與構造函數相同的錯誤。有趣的是它指向_wmain,而我的主要功能被稱爲_tmain。我已經嘗試將子系統鏈接器從/ SUBSYSTEM:WINODWS更改爲/ SUBSYSTEM:CONSOLE,但它已經設置爲/ SUBSYSTEM:CONSOLE。很明顯,我的實現比這個做得更多,但是我把它全部剔除以便跟蹤這個問題。幫助wpuld被折服,這是讓我瘋狂。我是C++新手。

+0

確定關於這個更多的問題..只是移動頭文件中的實現。模板**不能在頭文件/源文件中分開。 – 2012-07-12 14:53:24

+0

[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – 2012-07-12 14:55:36

+1

此外,您不應該使用[保留名稱](http://stackoverflow.com/q/228783/204847)作爲包含警衛。 – 2012-07-12 14:56:27

回答

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 
+0

_linker_需要它們。編譯器只需要聲明。 – xtofl 2012-07-12 14:56:12

+1

@xtofl實際上,編譯器需要它們來生成鏈接器的代碼;) – 2012-07-12 14:57:18

+0

謝謝,這有很多幫助,所以這意味着我無法在.h和.cpp文件中加亮所有內容? – amaurs 2012-07-12 15:26:27

0

編譯器不會編譯您的模板類成員定義,因爲它們不包含在任何編譯單元中。

但是,它確實看到使用了一些成員,因此它會爲這些成員生成'未定義'符號。

接下來是鏈接器,試圖將未定義的符號與其中一個編譯對象文件中定義的某些符號進行匹配。

但是,LinkedList::~LinkedLis()析構函數尚未編譯,所以它不在任何目標文件中,這就是鏈接器所抱怨的內容。

您可以通過

  • 解決這個問題,包括主要的源文件中的定義文件,
  • 或粘貼模板頭文件中的定義,
  • 或包括從底部的模板實現文件的模板頭文件(我最喜歡的)