模板與C++的編譯模型奇怪地玩,因爲它們不是可執行代碼 - 它們是用於可執行代碼的模板。因此,將類分區爲.h/.cpp對的標準模型對於模板無法正確運行。
原因是您通常會將具有接口和.cpp文件的類拆分爲具有實現的.h文件,因爲通常可以在引用其他.cpp文件中定義的代碼時單獨編譯.cpp文件,因爲編譯完文件後,鏈接器會將所有引用修補到一起。由於所有.cpp都編譯成包含可執行代碼的目標文件,因此所有內容都可以正確運行。
但是,使用模板會導致系統崩潰。如果您定義了一個模板類,然後將其成員函數的所有實現放入.cpp文件中,那麼當編譯器編譯該文件時,它將找不到任何代碼 - 只需模板代碼,因此它不會爲模板方法生成任何目標代碼。因此,在鏈接時,由於沒有可用的代碼,因此您將嘗試調用模板類的每個成員函數都會出錯。
我不確定這是什麼原因導致了你的特定錯誤,但是從你描述的情況來看,這看起來就是這種情況,特別是因爲你改變了一個非模板類。 h/.cpp對)轉換爲模板類。
要解決這個問題,傳統的C++解決方案只是爲沒有附帶源文件的模板提供一個.h文件。只需將源文件中的所有代碼移動到標題中即可。我喜歡把一個行頭標記的界面停止和地方開始實施,往往像
/* * * * * Implementation Below This Point * * * * */
或
/* * * * * Here be Dragons * * * * */
爲了使點更清楚一點。
希望這會有所幫助!
請給我們原始的課程代碼和模板代碼。 – 2011-02-18 23:44:09