[英]C++ Templates Declaration Order
我正在嘗試編譯一個實例化模板類的最小示例。 當保留聲明的特定順序時,該示例編譯良好,但否則失敗。
temp.h:
#include <iostream>
template <bool display>
class test {
public:
void sayHi();
};
temp.cpp:
#include "temp.h"
template <bool display>
void test<display>::sayHi () {
if (display) std::cout << "Hi";
}
main.cpp中:
#include <iostream>
#include "temp.h"
int main () {
test<true> myobject;
myobject.sayHi();
return 0;
}
這是如何包含類的標准。 在GCC 4.4.6中,此操作失敗,並顯示錯誤main.cpp :(。text + 0x3a):未定義對“ test :: sayHi()”的引用
但是,該示例在我在main.cpp文件中執行#include“ temp.cpp”而不是#include“ temp.h”時進行編譯,以便編譯器首先讀取temp.h中的類聲明,然后查看其中的內容。 temp.cpp,然后才是main.cpp的內容。
當我使用非模板類時,在main.cpp中僅包含.h文件可以很好地工作-這里出了什么問題? 注意,temp.cpp包含在我的Makefile中,因此編譯器絕對不應忘記它。 謝謝你的幫助。
請參閱C ++ FAQ Lite條目[35.12]為什么不能將模板類的定義與其聲明分開,然后將其放入.cpp文件中? 。
sayHi()
方法的定義(aka主體)必須在temp.h標頭中,或在另一個包含的文件中; 實例化test<true>
時需要完整的代碼。
對於模板,聲明和定義都必須在同一文件中。 您可以通過將所有代碼放在一個文件中(並使函數定義內聯或不內聯,由您自己決定),或將聲明和定義分開,但將定義文件包括在.h文件底部,以實現此目的。 。
原來如此
tmp.h:
#include <iostream>
template <bool display>
class test {
public:
void sayHi();
};
#include "tmp.cpp"
和tmp.cpp和main.cpp保持不變(但您不將tmp.cpp交給編譯器進行編譯,因為tmp.h包含了該文件)。
許多人使用.template擴展名而不是.cpp擴展名來命名其中具有模板函數定義的文件(它使您知道它不應該被編譯,而且看起來比包含.cpp文件更奇怪),但是您卻不這樣做。不必。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.