2010-04-28 62 views
7

我有一個類MyClass,它是以typename T爲模板的。但是在裏面,我想要一個模板化在另一個類型TT上的方法(它與T)。T上的模板化方法:這是可能的/正確的

讀/修修補補後,我發現下面的符號:

template <typename T> 
class MyClass 
{ 
    public : 
     template<typename TT> 
     void MyMethod(const TT & param) ; 
} ; 

文體上(我喜歡有一個頭文件我的模板類的聲明,而在另一頭文件中的方法定義),我不會在類聲明中定義方法。所以,我必須把它寫成:

template <typename T>  // this is the type of the class 
template <typename TT> // this is the type of the method 
void MyClass<T>::MyMethod(const TT & param) 
{ 
    // etc. 
} 

我知道我必須爲「聲明」中的方法使用的typenames,但不知道究竟怎麼了,並通過試驗和錯誤發現。

上面的代碼在Visual C++ 2008上編譯,但是:這是在T上模板化類的模板上有一個方法模板的正確方法嗎?

作爲獎勵:這類代碼背後是否存在隱藏的問題/意外/約束? (我想專業化可以寫得很有趣)

+1

至於專業化:你不能專門化一個成員函數沒有明確地專門化包含類:http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template-功能-IN-A-模板類/ 2114807 – 2010-04-28 22:59:37

回答

3

這確實是做你想做的事情的正確方法,它可以用在每一個體面的C++編譯器上。我在gcc4.4和最新的clang發行版上測試過它。

任何類型的代碼背後都有問題/意外/限制。

您最終可能會使用此代碼運行的主要問題是您無法使模板化函數變爲虛擬模式,因此如果您想在模板函數的類級別獲得多態性,那麼您無法實現它一個外部功能。

0

我認爲可以這樣做。看看std :: vector實現的例子。你有類向量,它有幾個模板參數(最着名的是一個元素類型),在裏面,它的一個構造函數的聲明方式與你的方法類似。它具有InputIterator作爲模板參數。所以我認爲這不是很少見的做法。

相關問題