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

特殊化されたクラス テンプレートは、テンプレートではなく、変な名前の通常のクラスになります。特殊 化するとchrrr<char>、それはテンプレートではなくなり、そのクラス メンバーの実装はテンプレートの特殊化ではなくなります。したがって、次のように書くだけです。

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

あなたが前に置いたのtemplate<>は、特殊化する別のテンプレートがまだあると言っていますが、そうではありません.

于 2013-03-27T15:57:54.103 に答える