2010-10-21 189 views
23

考慮以下模板類。C++模板 - 多種類型

template <class T> 
class MyClass 
{ 
    void MyFunc(); 
} 

template <class T> 
void MyClass<T>::MyFunc() 
{ 
    //...implementation goes here 
} 

我需要添加其他功能myfunc2所它接受一個額外的模板ARG T2

template <class T> 
class MyClass 
{ 
    void MyFunc(); 

    template <class T2> 
    static void MyFunc2(T2* data); 
} 

template <class T> 
void MyClass<T>::MyFunc() 
{ 
    //...implementation goes here 
} 

template <class T, class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
    //...implementation goes here 
} 

我使用VS 2008的編譯器。我得到錯誤

error C2244: unable to match function definition to an existing declaration 

函數定義和聲明應該如何在這種情況下看起來像。

+2

通常情況下,在類模板定義中內聯模板成員函數的定義會更容易,以避免所有這些小問題 – 2010-10-21 11:12:27

回答

24
template <class T> 
template <class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
    //...implementation goes here 
} 

編輯2:

$ 14.5.2/1 - 「A模板可以是一個類或類 模板內聲明 ;這樣的模板被稱爲 構件模板的成員模板。 可定義在其類別內部或外部 定義或類別模板 定義 類別模板的成員模板定義在類別模板的 之外定義 應使用 模板的 模板的 模板參數以及 模板的 模板參數。

+0

我總是發現這個語法awkw ard,嵌套類不會更好... – 2010-10-21 17:15:00

+0

@Chubsdad:原始模板成員函數聲明中的static關鍵字怎麼樣?在實施中放棄它有效嗎? – 2011-08-10 23:33:55

18

你在做什麼是好的,嘗試了這一點:

template <typename S,typename T> 
struct Structure 
{ 
    S s ; 
    T t ; 

} ; 

int main(int argc, const char * argv[]) 
{ 
    Structure<int,double> ss ; 
    ss.s = 200 ; 
    ss.t = 5.4 ; 

    return 1; 
} 

此代碼的工作。如果你得到奇怪的錯誤,看看你是否向前聲明Structure只使用1個。模板參數(這就是我在做的)