2011-02-18 107 views
0
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyList<class Event>::~MyList<class Event>(void)" ([email protected]@@@@[email protected]) referenced in function _main 

任何想法可能會出錯?我有一個工作課,然後我試圖模板,我得到上述錯誤。任何想法 ?我有點迷路。編譯代碼時出錯嘗試將類轉爲模板

而且在主我用這個:

MyList<Event> eventManager; 
+0

請給我們原始的課程代碼和模板代碼。 – 2011-02-18 23:44:09

回答

2

模板與C++的編譯模型奇怪地玩,因爲它們不是可執行代碼 - 它們是用於可執行代碼的模板。因此,將類分區爲.h/.cpp對的標準模型對於模板無法正確運行。

原因是您通常會將具有接口和.cpp文件的類拆分爲具有實現的.h文件,因爲通常可以在引用其他.cpp文件中定義的代碼時單獨編譯.cpp文件,因爲編譯完文件後,鏈接器會將所有引用修補到一起。由於所有.cpp都編譯成包含可執行代碼的目標文件,因此所有內容都可以正確運行。

但是,使用模板會導致系統崩潰。如果您定義了一個模板類,然後將其成員函數的所有實現放入.cpp文件中,那麼當編譯器編譯該文件時,它將找不到任何代碼 - 只需模板代碼,因此它不會爲模板方法生成任何目標代碼。因此,在鏈接時,由於沒有可用的代碼,因此您將嘗試調用模板類的每個成員函數都會出錯。

我不確定這是什麼原因導致了你的特定錯誤,但是從你描述的情況來看,這看起來就是這種情況,特別是因爲你改變了一個非模板類。 h/.cpp對)轉換爲模板類。

要解決這個問題,傳統的C++解決方案只是爲沒有附帶源文件的模板提供一個.h文件。只需將源文件中的所有代碼移動到標題中即可。我喜歡把一個行頭標記的界面停止和地方開始實施,往往像

/* * * * * Implementation Below This Point * * * * */ 

/* * * * * Here be Dragons * * * * */ 

爲了使點更清楚一點。

希望這會有所幫助!

0

你最有可能把你的函數的實現(在這種情況下,析構)成.cpp文件。這是行不通的。當與模板一起使用時,任何人都可以訪問完整的函數體,所以你通常會把它放到.h文件中。