当我研究模板专业化时,我使用了一个非常简单的例子,但我仍然有错误。
#include <iostream>
template <class T>
class chrrr{
public:
T chgchr(T c);
};
template < class T>
T chrrr<T>::chgchr(T c){
return c+1;
}
template <>
class chrrr<char>{
public:
char chgchr(char c);
};
template <>
char chrrr<char>::chgchr(char c){
return c+2;
}
using namespace std;
int main(){
char a='a';
int i=1;
chrrr<int> it;
chrrr<char> ch;
cout<<ch.chgchr(a)<<endl;
cout<<it.chgchr(i)<<endl;
return 0;
}
错误说:
line 20: error: template-id ‘chgchr<>’ for ‘char chrrr<char>::chgchr(char)’ does not match any template declaration
我想知道为什么它不匹配?如果我在类定义体中而不是在外侧定义chgchr,它的效果非常好。
答案 0 :(得分:13)
您已明确专门化该类,从而生成一个名为chrrr<char>
的完全实例化类型。定义成员函数时,不需要提供模板参数。简单地:
char chrrr<char>::chgchr(char c){
return c+2;
}
然而,似乎你专注于整个班级只是为了专门化一个功能。你可以用:
来做到这一点template <class T>
class chrrr {
public:
T chgchr(T c);
};
template <class T>
T chrrr<T>::chgchr(T c){
return c+1;
}
// Explicitly specialize for the member function
template <>
char chrrr<char>::chgchr(char c){
return c+2;
}
答案 1 :(得分:3)
专门的类模板导致普通的类
一个有趣的名字,而不是一个模板。当你专攻
chrrr<char>
,它不再是模板,而是
其类成员的实现是不是模板
专业化。所以你应该写一下:
char
chrrr<char>::chgchr( char c ) ...
你放在前面的template<>
表示还有
另一个专门的模板,但事实并非如此。