2016-08-22 51 views
1

我知道模板函數必須在頭文件中定義,由於某種原因我忘了。但是我相信非模板函數,即使它們屬於模板類,也可以在.cpp文件中定義。這是允許的嗎?如果不是,爲什麼不呢?謝謝:).cpp文件中模板類的非模板方法 - 未定義的引用?

+0

Uhm,模板類的全部都是模板,即使它不顯示在方法簽名或方法的代碼中;因爲即使類佈局通常依賴於模板參數(所以模板參數未出現的方法的生成代碼在不同的模板實例化之間可能會有所不同),因此定義何時允許「挑選」單個方法只會添加標準更混亂的規則。將所有模板不變的東西移動到基類的簡單解決方案似乎是更好的選擇。 –

回答

3

實際上,必須在頭文件/使用點定義什麼(除非在其他地方發生明確的實例化),都是「模板化實體」。到目前爲止,在C++中沒有這樣的術語,但提案正在將其添加到語言中,因爲許多規則適用於「模板化實體」,而不僅僅適用於模板。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0391r0.html

的原因應該是顯而易見的。就像模板一樣,模板的成員可以使用模板參數,所以它們的源必須可用於實例化。

解決此問題的類(如果成員函數不使用模板參數)的訣竅是將函數放在非模板基類中,並從類模板繼承該類。

+0

感謝您的幫助。所以基本上不可能在.cpp中實現一個不使用模板類型的非模板成員函數,也不是因爲編譯器缺少必需的信息,而僅僅是因爲C++的限制,對吧? – Virus721

+0

我認爲這不僅是因爲這一點。但是由於編譯器在編譯cpp文件時無法與模板類mmeber的用戶進行通信,即該函數沒有「使用模板參數」並已被編譯。呼叫站點上的用戶需要知道這一點,以便以不同的方式調用此函數(即不使用包含模板參數編碼等的符號名稱)。然後,當這種功能被認爲是使用這些參數的時候,有什麼規則需要用語言來表述。是否使用「這個」計數? –