當我們讓我們在一個頭文件中聲明其功能和在源文件中定義這些類...然後在頭文件可以包含在主文件中使用類...模板中包含頭文件。
但是,如果我們在頭文件中聲明模板類,並在.cpp文件中定義它,然後如果我們包括主(含INT主)的頭文件文件那麼爲什麼鏈接錯誤作物起來......和誤差不突然出現如果我們在主文件中包含.cpp文件(包含頭文件)...任何答案plz?
當我們讓我們在一個頭文件中聲明其功能和在源文件中定義這些類...然後在頭文件可以包含在主文件中使用類...模板中包含頭文件。
但是,如果我們在頭文件中聲明模板類,並在.cpp文件中定義它,然後如果我們包括主(含INT主)的頭文件文件那麼爲什麼鏈接錯誤作物起來......和誤差不突然出現如果我們在主文件中包含.cpp文件(包含頭文件)...任何答案plz?
模板實際上不產生在其中編譯器讀取它們的源代碼中的任何點的目標代碼;他們是(通常)只有「實例」當事情真正使用的模板。所以,如果你在一個源文件中定義了一個模板函數,並從另一個源文件中調用它,那麼模板函數的代碼根本不會被編譯:它不在第一個目標文件中,因爲沒有任何需要它的東西,它不在第二個目標文件,因爲編譯器無法訪問函數的定義。
你在頭文件中定義模板功能,使每個翻譯單元,其中一些調用模板函數,編譯器可以訪問它的代碼,並可以編譯複製它專門用適當的模板參數。
或者,你可以使用explicit instantiation:你在.cpp
文件定義模板功能,和還告訴編譯器正是它應該編譯功能哪些類型。這是難以維持的,因爲你需要跟蹤這些都是由程序的其餘部分需要的實例。如果有什麼要求foo<float>()
,但你只明確實例化foo<int>()
和foo<char>()
,你得到一個丟失的符號錯誤。
您不應該從.cpp
文件中刪除#include
a .cpp
文件。只需將模板函數定義與它們的聲明一起放在標題中即可。
模板是不是類或函數。它是編譯器用來生成類或函數的模式。
在 HERE非常漂亮解釋