1. 程式人生 > >C++模板類代碼只能寫在頭文件?

C++模板類代碼只能寫在頭文件?

自己 pen 找到 所有 xxx 個性 內容 就是 rdquo

  這個問題,實際上我幾年前就遇到了。最近寫個模板類玩的時候,再次遇到。

  當我非常仔細的將定義和實現分開,在頭文件中保留了最少的依賴後,一切就緒.cpp單獨編過。但是當使用的時候,就會報告所有的函數調用都沒有實現。按常規.h/.cpp而言這是不可能的。但是模板類就是這麽獨特。簡單說說他的原因,也備自己將來遺忘:

  從語法角度而言,是沒有強制要求說模板代碼的聲明和實現不可以分開。那麽當分離的聲明和實現寫好後,單獨編譯.cpp是可以通過的,但是生成的.o文件卻非常小,只有一個原因:確實沒有任何實現代碼!————不知道用什麽類型參數套用模板。

  因為模板類需要在使用到的地方利用聲明模板的typename或者class參數的時候,才會即時生成代碼。那麽當我把模板聲明和實現分開的時候,這個即時過程因為編譯器只能通過代碼include“看到”頭文件而找不到模板實現代碼,所以會產生鏈接問題。這也是為什麽幾乎都會建議模板類和聲明和實現都寫在頭文件。

  如果剛接觸c/c++編寫的朋友可能還不是很明白。編譯器面對巨量代碼的時候,也是以一個一個的.cpp/.c文件作為基本單元,根據代碼的include包含找到聲明,翻譯代碼產生.o文件。註意他們每個cpp/c文件都是相互獨立完成自己工作的,對於缺少的部分,如果妥善聲明,會留待鏈接過程的時候產生引用關系。 那麽剛才說的模板類實現代碼,編譯它的時候因為不知道套用什麽參數,實際上沒有任何有用的內容存在於.o文件當中。而在使用模板類的地方指定了類型參數,編譯器這才開始根據模板代碼產生有用的.o編碼,可是這些內容放在了使用模板的代碼產生的.o文件當中。如果編使用模板代碼的時候,通過include包含“看不到”模板的實現代碼,這些所有的缺失,到鏈接階段就無法完成。

  所以最後的結論是:請老老實實把模板的實現和聲明都寫在頭文件吧。如果你很有想法有個性,可以堅持,然後試試#include “xxxx.cpp” 這樣屌炸的代碼。

https://blog.csdn.net/jinzeyu_cn/article/details/45795923

C++模板類代碼只能寫在頭文件?