2016-10-05 3 views
0

私は、メソッドのコンテキストでは特殊化に関する多くのSOの質問を見ましたが、クラスに属する関数ではありません。私はこれらの質問から渡された知識をここの問題に翻訳するのに苦労しています。クラスメソッドのテンプレートの特殊化。 "関数テンプレートは既に定義されています"

私は過去に習得したクラスを使っています。算術型の特化が必要です。

template <typename T> 
class Vector3 
{ 
public: 
    T x; 
    T y; 
    T z; 

public: 
    operator std::string() const; 
} 

これは私がやろうとしています専門である:私がコンパイルしようとすると

template<typename T = std::enable_if<std::is_arithmetic<T>::value, T>::type> 
inline Vector3<T>::operator std::string() const { 

    std::stringstream ss; 
    ss << "NOT NUMBER {" << x << ", " << y << ", " << z << "}"; 

    return ss.str(); 
} 

template<typename T = std::enable_if<!std::is_arithmetic<T>::value, T>::type> 
inline Vector3<T>::operator std::string() const { 

    std::stringstream ss; 
    ss << "NUMBER {" << x << ", " << y << ", " << z << "}"; 

    return ss.str(); 
} 

はしかし、私は

エラーC2995取得:「するVector3 ::演算子のstd ::文字列(void)const ':関数 テンプレートは既に定義されています

私はこれをgoogleするとき、通常、人々がCPPファイルとヘッダーファイルでクラス/メソッドを定義した場合です。ヘッダーファイルでのみこれを行うので、私はenable_ifが正しくないと仮定できます。私が他の例を見てみると、それらは専門化をするだけですが、is_arithmiticの方法を使いたいと思います。

私は間違っていますか?

template<typename T = XXX> 
inline Vector3<T>::operator std::string() const { ... } 

が問題で、すべて、この時点で起こって何の控除がないていない、とTがすでに定義されています。事前

答えて

4

ここでデフォルトに感謝します。それは合法ですが、ただのノイズです。

さて、あなたは部分的にどちらかのクラステンプレートでメンバ関数を特化することはできませんが、我々は特色に派遣することができます。

template <class T> 
class Vector3 { 
public: 
    // ... 
    operator std::string() const { 
     return as_string(std::is_arithmetic<T>{}); 
    } 

private: 
    std::string as_string(std::true_type) { 
     // implementation for arithmetic types 
    } 

    std::string as_string(std::false_type) { 
     // implementation for non-arithmetic types 
    } 
}; 
+0

返信いただきありがとうございます。私はすべてのグーグル・グーグルの後にタグ・ディスパッチを使用しなければならないと感じました...誰かがこれを正しいとマークする前に他のアイデアを持っているかどうかを見ていきます。 – user819640

1

バリーの答えは完璧です。ここで

は、いくつかの説明と提案です:

http://en.cppreference.com/w/cpp/types/enable_if

「よくある間違いは、デフォルトのテンプレート引数のみが異なる2つの関数テンプレートを宣言することです、デフォルトのテンプレート引数がの一部ではないので、これは違法です。同じ署名を持つ2つの異なる関数テンプレートを宣言することは不正です」と述べています。

関連する問題