2011-10-23 18 views
1

我有不同的課程都安排在一個層次結構。 爲了減少代碼量,我開始創建模板函數。基類將使用模板函數,並且一些派生類也將使用相同的函數。我想在哪裏放置所有這些模板,所以我沒有像我一樣未定義的參考問題?我應該將所有的定義放在一個頭文件中,然後將這些頭文件包含在調用函數的類的.cpp部分中。那會工作嗎?截至目前,我所有的類(class.cpp,class.h)都可以正常編譯,但在鏈接過程中,所有的東西都會炸燬。我試圖把所有的模板放在一個命名空間中,然後在我的所有類的實現中包含該命名空間,但這似乎不起作用。我的問題是,你將如何去做一個單獨的實體,只保存任何類可以使用它的數據成員的模板函數?(C++)我在哪裏放置所有模板?

+0

可能重複[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-文件) –

回答

1

我看到很多人被這個東西困惑.. 。模板不是類型。 它們在實例化時變成類型。 由於這個原因,模板的成員必須保留在您要使用它們的相同數據單元中。

如果您的模板是通用的,並且您想要在所有代碼中使用它,只需將所有內容放在頭文件中即可。

現在,如果你不喜歡(而且我會理解)你在同一個文件中顯示聲明和定義以及實現,你可以將模板分成兩個不同的文件。

例如,帶有聲明的「list.h」和帶有您的實現的「list.inc」。

爲了使它工作,你必須包括兩個。

2

模板函數和模板類的定義屬於頭文件,而不是.cpp文件。

這是因爲編譯器本質上必須爲文件中使用的每個模板參數集生成一個全新的函數,該文件的頭部爲#include。如果模板函數是在.cpp文件中定義的,那麼必須在不知道調用代碼是什麼樣子的情況下生成這些函數的所有適當版本,這基本上是不可能的。 (你用這種方法獲得了模板函數的重複定義,但鏈接器刪除了這些,並確保只有一個副本,如果每個模板實例化在最後的二進制文件中。)