このように呼び出すと:
doSomething(12.0, 23.0f, 2.0f);
次に、基本的にコンパイラーにT関数の引数からテンプレート引数を推測させます。しかし、上記の呼び出しでは、すべての引数の型は同じではありません: 最初の引数12.0はdoubleであり、残りの 2 つの引数はfloat( in は aになり、 whileは.であることに注意してくださいf2.0ffloat2.0double)。したがって、コンパイラが引数として受け入れる関数を見つけようとしているため、問題が発生double, float, floatします。しかし、そのような機能はありません。また、すべての引数で同じTでなければならないため、引数から関数テンプレートを推測することはできません。
したがって、解決策は、または次Tのいずれかとして推測できます。doublefloat
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ます。