簡體   English   中英

C ++模板聲明順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM