7

在学习模板专业化时,我使用了一个非常简单的示例,但仍然出现错误。

#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,它会很好地工作。

4

2 回答 2

16

您已经明确专门化了该类,从而产生了一个完全实例化的类型,称为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; 
}
于 2013-03-27T15:55:28.497 回答
4

专门的类模板会生成一个具有有趣名称的普通类,而不是模板。当您specialize chrrr<char>时,它​​不再是模板,其类成员的实现也不是模板特化。所以你应该简单地写:

char
chrrr<char>::chgchr( char c ) ...

你前面说的template<>还有一个模板需要专门化,其实不是这样的。

于 2013-03-27T15:57:54.103 回答