2016-04-23 16 views
0

私はコードを機能として表示するチュートリアルで見つけたこのベクトルを使用しようとしています。しかし私のプロジェクトでそれを使用しようとすると、 "エラーC3211: 'vector :: vecarg':明示的な特殊化は部分的な特殊化構文を使用しています。代わりに<>テンプレートを使用してください"明示的な特殊化は部分的な特殊化構文を使用しています

エラーのあるセクション

template< class ta_a > 
class vecarg 
{ 
    const ta_a& Argv; 
public: 
    inline vecarg(const ta_a& A) : Argv(A) {} 
    inline const float Evaluate(const int i) const 
    { 
     return Argv.Evaluate(i); 
    } 
}; 

template< class ta_a> 
class vecarg< const float > 
{ 
    const ta_a& Argv; 
public: 
    inline vecarg(const ta_a& A) : Argv(A) {} 
    inline const float Evaluate(const int i) const 
    { 
     return Argv; 
    } 
}; 

template< class ta_a > 
class vecarg< const int > 
{ 
    const ta_a& Argv; 
public: 
    inline vecarg(const ta_a& A) : Argv(A) {} 
    inline const float Evaluate(const int i) const 
    { 
     return (float)Argv; 
    } 
}; 

私は

template< > 
class vecarg< const float > 
{ 
    const ta_a& Argv; 

に変更することでこのエラーを修正した場合、その後にエラーが "識別子 'ta_aが' 未定義である"

解決策に関する提案は高く評価されています。

+2

'const ta_a & Argv;'は 'const float & Argv;' –

+0

にする必要がありますエラーメッセージはそれを修正する方法を教えてくれませんか? –

+0

_ "編集:一度修正すると新しいエラーが発生します。" _それをしないでください。質問ごとに1つの質問。 –

答えて

1

これは間違っている:vecargが唯一のテンプレートパラメータを持っているので、

template< class ta_a> 
class vecarg< const float > 

これはエラーです:それはそのパラメータに特化することができますが、その後、これ以上のテンプレートパラメータはありません。しかし、このコードでは、2つのパラメータ、ta_afloatを書き込もうとしています。

template<class T>によって導入された特殊化は部分的でなければならないため、エラーメッセージは「部分的な特殊化」と言います(まだパラメータがTであるため完全ではありません)。

完全な専門のコードは次のようになります

template<> // zero parameters which have not been specialized 
class vecarg< const float > 
{ 
    const float& Argv; 
public: 
    vecarg(const float& A) : Argv(A) {} 
    const float Evaluate(const int i) const 
    { 
     return Argv; 
    } 
}; 

I冗長inline指定子を除去します。他の専門化の試みにも同様の変更を加える必要があります。

このコードの作成者がコンパイルを主張した場合、彼はかなり変なコンパイラを持っていたに違いありません。

関連する問題