このように呼び出すと:
doSomething(12.0, 23.0f, 2.0f);
次に、基本的にコンパイラーにT
関数の引数からテンプレート引数を推測させます。しかし、上記の呼び出しでは、すべての引数の型は同じではありません: 最初の引数12.0
はdouble
であり、残りの 2 つの引数はfloat
( in は aになり、 whileは.であることに注意してくださいf
2.0f
float
2.0
double
)。したがって、コンパイラが引数として受け入れる関数を見つけようとしているため、問題が発生double, float, float
します。しかし、そのような機能はありません。また、すべての引数で同じT
でなければならないため、引数から関数テンプレートを推測することはできません。
したがって、解決策は、または次T
のいずれかとして推測できます。double
float
doSomething(12.0f, 23.0f, 2.0f); //all are float now
またはこれ:
doSomething(12.0, 23.0, 2.0); //all are double now
最初のケースでT
は、 と推定されfloat
、2 番目のケースでT
は、 と推定されdouble
ます。
または、テンプレート引数を次のように指定することで、テンプレート引数の推論に依存しないことを選択できます。
doSomething<float>(12.0, 23.0f, 2.0f);
またはこれ:
doSomething<double>(12.0, 23.0f, 2.0f);
ここで、最初のケースでは第 1 引数が に変換されfloat
、第 2 のケースでは第 2 および第 3 引数が に変換されdouble
ます。