在寫程式中使用了函式模板 template之前執行過程沒有什麼問題,當我把函式放到另乙個編譯單元之後出現了「無法解析的外部符號」問題。原因就出在類模板上。
首先,乙個編譯單元(translation unit)是指乙個.cpp檔案以及它所#include的所有.**件,.**件裡的**將會被擴充套件到包含它的.cpp檔案裡,然後編譯器編譯該.cpp檔案為乙個.obj檔案。不同的cpp檔案是分開編譯的。再由聯結器(linker)進行連線成為乙個.exe檔案。
在函式模板所包含的cpp檔案中,如果沒有對此模板進行例項化的過程,所編譯的obj檔案沒有對類模板進行例項化,主函式的cpp檔案也不會對此類模板進行例項化。也就不會生成二進位制檔案。
也就是說
template
t test(t a,t b)
在編譯過程只有在同乙個cpp檔案及其include的檔案中有引用函式模板的過程,函式模板才會轉化成對應的函式。比如有int test(1,3),這個時候編譯的過程中就會生成int test(int ,int)這個函式,如果沒有函式模板呼叫的過程,就不會生成任何函式。
解決方法:
將類的宣告和定義放在同乙個.**件中。
在類模板出現的cpp檔案對應的.**件中include .cpp檔案。
在主函式所在的main.h中include .cpp檔案。
參考:更詳細
C 函式模板使用
一.函式模板的使用 什麼是函式模板 就是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表,在個通用函式就稱為函式模板。函式模板的定義 格式 函式模板由三個部分組成 模板說明 函式定義 函式模板呼叫 1 模板說明 template 型別形式參數列 型別形式參數列 typenam...
c 函式模板的使用
include 函式模板的使用 define max a,b a b a b 巨集定義 using namespace std templatetype max type a,type b 整形數和實型數進行比較 char max char a,char b 字串的模板 void main exam...
C 函式模板的使用
在 c 函式過載 一節中,為了交換不同型別的變數的值,我們通過函式過載定義了四個名字相同 引數列表不同的函式,如下所示 交換 int 變數的值 void swap int a,int b 交換 float 變數的值 void swap float a,float b 交換 char 變數的值 voi...