模板特化:与任何模板声明都不匹配

时间:2013-03-27 15:52:50

标签: c++ templates

当我研究模板专业化时,我使用了一个非常简单的例子,但我仍然有错误。

#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,它的效果非常好。

2 个答案:

答案 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<>表示还有 另一个专门的模板,但事实并非如此。