Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

template specialization : does not match any template declaration

Tags:

c++

templates

When I study the template specialization, I use a very simple example, but I still got error.

#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;
}

The error said:

line 20: error: template-id ‘chgchr<>’ for ‘char chrrr<char>::chgchr(char)’ does not match any template declaration

I wonder why it dose not match? And if I define chgchr in class definition body rather than out side, it works very well.

like image 309
Kuan Avatar asked Mar 27 '13 15:03

Kuan


1 Answers

You have explicitly specialized the class, resulting in a fully instantiated type called chrrr<char>. You don't need to give the template arguments when defining the member function. Simply:

char chrrr<char>::chgchr(char c){
    return c+2; 
}

However, it seems you are specializing the whole class just to specialize a single function. You can do that with:

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; 
}
like image 58
Joseph Mansfield Avatar answered Sep 27 '22 20:09

Joseph Mansfield