2013-05-27 178 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