2013-03-27 145 views
4

当我研究模板专业化时,我使用了一个非常简单的示例,但仍然出现错误。模板专业化:不匹配任何模板声明

#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

感谢德鲁编辑! – Kuan 2013-03-27 16:19:19

回答

12

您已明确地专门化该类,从而生成一个完全实例化的类型,称为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; 
} 
+0

谢谢! SFTRABBIT! 我发现你和James的答案都非常有用,他们给我两种方式来定义模板类方法 – Kuan 2013-03-27 16:06:11

3

专业类模板导致正常类 一个有趣的名字,而不是一个模板。当你专门 chrrr<char>,它不再是一个模板,并且它的类成员的 执行是而不是模板 专业化。所以,你应该简单地写:

template<>你放在前面说,还有 要专门另一个模板,这是情况并非如此。

+0

谢谢!詹姆士。我想我需要阅读更多教程! – Kuan 2013-03-27 16:01:04

+0

如果不是您使用的书,我会强烈推荐_C++模板:完整指南_,作者:David Vandevoorde和Nicolai Josuttis。它涵盖了所有的细节,并且仍然保持极高的可读性。 – 2013-03-27 16:14:20

+0

好吧,我会找到它,看看我能否理解这些概念。谢谢,詹姆斯! – Kuan 2013-03-27 16:18:01