一個晚上都沒有解決這個bug,問了個同學才知道。
模板編程時,如果分離編譯會造成鏈接出錯,報collect2 error ld returned 1 exit status錯誤。
解決方案:
1. 實現寫到.h文件中,當然這樣可能會造成可執行程序過大;
2. 在模板實現文件中實例化一份別的cpp需要用到的模板實例。
原因:
鏈接器去別的.o文件找實現,模板實現類沒有實例化的代碼,比如你需要A<int>,而模板實現類.o文件中找不到A<int>的函數入口,所以出錯。
具現(instantiations):表示程序將真正的類型和表達式綁定到模板相關形式參數上的操作。也叫做實例化。
在C++中。編譯器在看到模板的定義的時候。並不馬上產生代碼,僅僅有在看到用到模板時,比方調用了模板函數 或者 定義了類模板的
對象的時候。編譯器才產生特定類型的代碼。
Appendix:
普通的鏈接出錯一般就是找不到實現,或者漏掉了需要鏈接的目標文件或動態、靜態鏈接庫,查找一下即可。
在C++中。編譯器在看到模板的定義的時候。並不馬上產生代碼,僅僅有在看到用到模板時,比方調用了模板函數 或者 定義了類模板的
對象的時候。編譯器才產生特定類型的代碼。