web-dev-qa-db-ja.com

パラメータのない関数のテンプレートの特殊化

関数テンプレートをc ++に特化する必要があります。

template<typename T>  
void doStuff<T>() {}

template<>
void doStuff<DefinedClass>();

そして

template<>
void doStuff<DefinedClass2>();

私はそれが正しい構文ではないと思います(コンパイルされていないため)。どうすればいいですか?
また、doStuff<DefinedClass>に未定義のテンプレートパラメータがないので、.cppで本文を宣言することは可能でしょうか?

注:doStuffは、本体でTを使用して変数を宣言します。

18
Mario Corchero

プライマリテンプレートは、テンプレート引数の2番目のペアを取得しません。これだけ:

template <typename T> void doStuff() {}
//                        ^^^^^^^^^

スペシャライゼーションのみが両方のtemplate <>前面と<...>名前の後、例:

template <> void doStuff<int>() { }
16
Kerrek SB

プライマリテンプレートの正しい構文は次のとおりです。

template <typename T>
void doStuff() {}

スペシャライゼーションを定義するには、次のようにします。

template <>
void doStuff<DefinedClass>() { /* function body here */ }
4
Angew

私はそれが正しい構文ではないと思います(コンパイルされていないため)。どうすればいいですか? doStuffは、その本体でTを使用して変数を宣言します。

template<typename T>  
void doStuff() 
{
  T t = T();   // declare a T type variable

}

.cppで本体を宣言することは可能でしょうか?

C++はinclusive modeのみをサポートします。個別にコンパイルして、後でリンクすることはできません。

コメントから、intタイプに特化したい場合:

template<>
void doStuff<int>()
{
}
2
billz