0

テンプレートパラメーターなしでテンプレート関数を呼び出すことができると思いました。テンプレート パラメータを double に指定した場合にのみ、このコードが機能するのはなぜですか?

#include <iostream>
template <typename T>
T max(T x, T y)
{
    return x > y ? x : y;
}

int main()
{
    cout<<::max(3,4.7)<<"\n";     //Error
    cout<<::max<int>(3,4.7)<<"\n"; //Error
    cout<<::max<double>(3,4.7)<<"\n"; //Works
}
4

1 に答える 1

3

テンプレートの引数推定は、関数のすべての引数に適用する必要があり、最初のケース (コンパイルされない場合のみ) では、引数が と であると推定されintますdouble。完全に一致しないため、引数の推定は失敗しますすでにお気づきのように、答えは型推論を無効にし、型引数を自分で提供することです (2 行目と 3 行目)。

明示的に特殊化された関数テンプレートと通常の関数の場合、引数は暗黙的またはユーザー定義の型変換(double から int、int から double、またはクラス コンストラクターと変換演算子を介して) の対象になります。ただし、テンプレート引数の推定中は、そのような型変換は実行されません。

于 2012-05-05T17:02:49.777 に答える