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.
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With