2016-05-12 10 views
3

テンプレート付き関数を使用したヘルパーテンプレートがあります。私は、特定のタイプのいくつかの値をキャストするキャストたりしないように、他のポリシーベースのテンプレートクラスのためにそれを使用しています:テンプレート付き関数を使用した特殊化テンプレートクラス

// use this when needed additional value cast 
template <typename T> 
struct AdditionalValueStaticCaster 
{ 
    template <typename U> 
    static T cast(U u) 
    { 
     return static_cast<T>(u); 
    } 
}; 

// use this specialization when no needed to cast value 
template <> 
struct AdditionalValueStaticCaster<void> 
{ 
    template <typename U> 
    static U cast(U u) 
    { 
     return u; 
    } 
}; 

は今、私は宣言と実装(.Hと.hhファイル)に、これらのクラスを分割したいです

だから私はこのような宣言を書く:

template <typename T> 
struct AdditionalValueStaticCaster 
{ 
    template <typename U> 
    static T cast(U u); 
}; 


template <> 
struct AdditionalValueStaticCaster<void> 
{ 
    template <typename U> 
    static U cast(U u); 
}; 

をそして今、私は実装を書きたいです。

template <typename T> 
template <typename U> 
T AdditionalValueStaticCaster<T>::cast(U u) 
{ 
    return static_cast<T>(u); 
} 

しかし、これは私がラインtemplate<>を削除すると、すべてがOKコンパイルが、私はまだ疑問を持っているエラーerror: too many template-parameter-lists

template<> 
template <typename U> 
U AdditionalValueStaticCaster<void>::cast(U u) 
{ 
    return u; 
} 

の原因:これはokです、それは適切なソリューションであるか、私が何かを逃しましたか?

答えて

3

私が行template<>を削除しても、すべてがコンパイルされますが、私はまだ質問があります:それは正しい解決策ですか、何か逃したのですか?

これは間違いなく、その行を削除するだけです。 AdditionalValueStaticCaster<void>は具体的な型であり、その型のメンバ関数テンプレートの定義を提供するだけです。したがって:

template <typename U> 
U AdditionalValueStaticCaster<void>::cast(U u) 
{ 
    return u; 
} 

他のクラス型のメンバ関数テンプレートと違い:

template <typename U> 
U SomeClass::cast(U u) 
{ 
    return u; 
} 
-2

私はあなたがテンプレート内でテンプレートを定義することができるとは思いません。 すべてのテンプレートパラメータを最初のテンプレート行に配置します。このような。このような実際のオブジェクトに特化

template <typename T, typename U> 
struct AdditionalValueStaticCaster 
{ 
    static T cast(U u) 
    { 
     return static_cast<T>(u); 
    } 
}; 

AdditionalValueStaticCaster< My_T_Type, My_U_Type> MyNewCaster; 

この My_T_Type My_T_Type_varように使用。 My_U_Type My_U_Type_var;

My_T_Type_var = MyNewCaster.cast(My_U_Type_var); 

申し訳ありませんが、これを確認するコンパイラはありませんが、構文は近いはずです。

+0

はい、できます。それを試してみるべきです。 – Barry

関連する問題