2012-02-10 133 views
3

我正在寫一個模板類,比方說包括模板類型的頭文件

template <class T> 
class bla { 
    bla() ; 
    ~bla() ; 
}; 

template <class T> 
bla<t>::bla(){} 

template <class T> 
b<t>::~b(){} 

這隻要T是int工作正常,char,等等...但在情況下,它會是一個自定義類MyClass,它將要求包含頭文件MyClass.h,還是我錯了?

問:這怎麼能在模板上下的方式進行,即像

#include "T.h" 

乾杯!

回答

4

當您使用bla<MyClass>時,您需要包含bla的定義和MyClass的定義。當定義bla時,不需要MyClass。關於這一點的魔力被稱爲「兩階段名稱查找」:在編譯模板定義時,查找所有不依賴於模板參數的名稱。在第二階段,當實例化模板時,所有剩餘的名稱將在實例化的上下文中查找。

+1

所以我只需要確保'MyClass'提供模板類'bla'中模板'T'所用的所有方法(在我實例化'bla '? – ezdazuzena 2012-02-10 09:21:12

+2

'是的,就是這樣。從本質上講,每個模板都應該被認爲是使用某些_concepts_實現的,即操作和類型的集合以及它們各自的語義和性能複雜性。然後,模板參數需要_model_這個概念,即提供所有必需的操作和類型 – 2012-02-10 09:26:16

1

那麼,這是相反的。如果您有一個類MyClass,您想在其中一個模塊(C++中的翻譯單元)中使用,那麼您將包含模板容器(上面放置的源代碼,名稱爲container.h),然後創建數據結構。

// main.cpp 

#include "container.h" 
#include "myclass.h" 

int main() 
{ 
    bla<MyClass> foo; 

    // lots of more things... 
} 

也許問題是,你不知道如何將模塊中的代碼分開。一個簡單的經驗法則是將每個類放在一個單獨的模塊中,每個模塊都帶有一個.h文件(所有聲明都在其中的界面)以及.cpp文件(實現文件,大致可以在其中寫入方法)。

希望這會有所幫助。

+0

不,這不是我的問題,重點在於DietmarKühl回答的問題,我想知道,模板類怎麼說'T'的方法,即'MyClass'。 – ezdazuzena 2012-02-10 09:19:59

+0

好吧,我想我誤解了這個問題無論如何,感謝閱讀並做出評論的努力。 – Baltasarq 2012-02-10 09:23:41