3

チュートリアルに基づいて、</p>

// Example 2: Explicit specialization 
// 
template<class T> // (a) a base template 
void f( T ){;}

template<class T> // (b) a second base template, overloads (a) 
void f( T* ){;}     //     (function templates can't be partially 
//     specialized; they overload instead)

template<>        // (c) explicit specialization of (b) 
void f<>(int*){;} // ===> Method one

また、警告なしで VS2010 SP1 で以下をテストします。

template<>        // (c) alternative
void f<int>(int*){;} // ==> Method two

質問> C++ 標準に基づく推奨される方法はどれですか? 方法1または方法2?

ご覧のとおり、方法 1 と方法 2 の主な違いは次のとおりです。

template<>        
void f<>(int*){;}    // ===> Method one

template<>        
void f<int>(int*){;} // ===> Method two
       ^^^

チュートリアルに基づいて、代わりに次の単純な古い関数を作成する必要があります。

void f(int*){;}

しかし、それは私が尋ねている質問ではありません:)

ありがとうございました

4

1 に答える 1

1

完全な特殊化宣言では、特殊化されるテンプレートが引数推定 (宣言で提供されるパラメーターの型を引数の型として使用) および部分的な順序付けによって決定できる場合、明示的なテンプレート引数を省略できます。 [Vandervoode、Josuttis による「C++ テンプレート」より]

これはあなたの例に当てはまるので、次のように書くことができます:

template<>
void f(int){;}

専門化する (a) および

template<>
void f(int*){;}

専門化する (b)。

于 2012-04-14T18:59:26.350 に答える