14

以下のテンプレートの動作と混同しています。ここでは、空の山括弧 (パラメーターなしのテンプレート) で正常にコンパイルされます。これは、構文的に、 template<> が明示的なテンプレートの特殊化をマークするために予約されているためです。

template <typename T> void add(T a, T b) { }
int main() {
    add<>(10, 3); // compiles fine since both parameters are of same data type
    add<>(10, 3.2); // Error: no matching function for call to add(int, double)
}

上記の場合、テンプレート パラメータは本当にオプションですか?

4

3 に答える 3

12

template<>明示的なテンプレートの特殊化をマークするために予約されています。

文脈に応じて、さまざまなことを意味します。ここでは、「デフォルトまたは推測された引数を使用する」ことを意味しますadd

最初のケースでは、両方の関数引数が同じ型であるため、テンプレート引数は として推定できますint

2 番目のケースでは、型が異なるため、テンプレート引数を推測できません。必要なものを指定する必要があります。たとえばadd<double>、一方の関数引数を他方に一致するように変換するか、テンプレートを変更して各型を個別にパラメータ化します。

上記の場合、テンプレート パラメータは本当にオプションですか?

はい、引数の型から推測できる場合。

于 2013-12-05T11:23:10.980 に答える
6

最初のケースでは、標準のルールを通じて を推測できるため、はい。2 番目の例では、できません。次のように記述する必要があります。

add<float>(10, 3.2);
于 2013-12-05T11:20:59.490 に答える
3

1 つのテンプレート パラメーターと、異なる型の 2 つの関数パラメーターがあります。テンプレート引数推定は両方の引数に一致する必要がありますが、int と double を指定すると機能しません。その理由は、推定される引数が完全に一致する必要があり、型変換が考慮されないためです。

構文

add<double>(10, 3.2); 

Tに等しいことを明示的に強制しますdouble。その場合、int定数10は に変換されdoubleます。

別のオーバーロードを追加することもできます

template <typename T, typename U> void add(T a, U b) { }

そして、それを要求することにより、SFINAEを使用してそれを制約する可能性がありますis_convertible<T, U>

于 2013-12-05T11:21:11.217 に答える