2013-02-08 7 views
11

関数テンプレートをC++で特殊化する必要があります。パラメータなしの関数のテンプレートの特殊化

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

template<> 
void doStuff<DefinedClass>(); 

template<> 
void doStuff<DefinedClass2>(); 

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

注:doStuffは変数を宣言するために本体を使用します。

+1

あなたは「それがコンパイルされていない」と言うとき、あなたは、関連するエラーメッセージを含める必要があります。 –

+0

' void doStuff (){}'は最初のところでもコンパイルされます(この ''は無効です)。 –

答えて

12

プライマリテンプレートはテンプレート引数の2番目のペアを取得しません。ちょうどこの:

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

のみ専門は例えば、名前の後にフロントでtemplate <><...>の両方を持っている:

template <> void doStuff<int>() { } 
+0

ありがとうございますが、まだ動作していません。 "template <> void doStuff();"のような特殊化を書くと、 ">トークンの前に無効な明示的な特殊化があります –

+0

"テンプレート "を置くと、" template-id 'buildBom がプライマリテンプレート" –

+2

"に宣言されていません。 (); '特殊化とテンプレート用 void doStuff();'一般的なケース... – Synxis

4

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

template <typename T> 
void doStuff() {} 

特殊化を定義するには、次のようにします。

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

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

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

} 

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

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

、あなたがintタイプに特化したい場合:

template<> 
void doStuff<int>() 
{ 
} 
関連する問題