2013-05-27 176 views
3

基本上,我試圖做的是在Template specialization of a single method from a templated class除了我TClass有多個模板參數這樣的討論:模板專業化參數

template < class KEY, class TYPE > 
class TClass 
{ 
public: 
    : 
    void doSomething(KEY * v); 
    : 
}; 

template < class KEY, class TYPE > 
void TClass<KEY, TYPE>::doSomething(KEY * v) 
{ 
    // do something 
} 

到目前爲止是這種情況,但是如何爲一個模板參數定義專門的實現?我嘗試添加此:

template < class TYPE > 
void TClass<int, TYPE>::doSomething(int * v) 
{ 
    // do something if KEY is int 
} 

但編譯器抱怨「無法定義的功能匹配到現有的宣言」,該方法/函數(VC2010)。

一點題外話:如果我在同一時間專注兩個模板參數,它的工作原理:

template < > 
void TClass<int, char>::doSomething(int * v) 
{ 
    // do something if KEY is int and TYPE is char 
} 

但是這不是我想做的事情。

有什麼建議嗎?

+0

順便說一句,從VS2015的錯誤信息可以廣泛無益。 C3860:錯誤的模板參數順序,以及C2995:模板已經定義。 –

回答

6

您必須通過局部特殊化定義一個方法之前,專門整個類:

template <typename T, typename U> 
class TClass; 

template <typename T> 
class TClass<int, T> 
{ 
    void doSomething(int* v); 
}; 

template <typename T> 
void TClass<int, T>::doSomething(int* v) 
{ 
    // ... 
} 

Live demo

1

你可以完全專注於類方法,但據我記得你不能部分專門化它。

您可以嘗試對整個班級進行部分專業化,但這可能會涉及很多重複。

+0

你的兩個答案基本相同。我標記了0x499602D2的答案,因爲它更詳細。 – marc40000