関数をオーバーロードしてから、オーバーロードの1つと完全に一致する引数を使用して関数を呼び出す場合
int f(int){return 3;}
int f(bool){return 4;}
... //inside main()
f(1); //Calls f(int)
コンパイラーは、暗黙の変換を試みる前に、この(完全な)一致を選択するだけです。しかし、私は関数temp→ateをオーバーロードしようとしています。
template <bool veracity>
int f(){return 1;}
template <int amount>
int f(){return 2;}
... //inside main()
f<1>();
しかし、コンパイラーは、オーバーロードされたf()へのあいまいな呼び出しについて不平を言い続け、それがまたはのいずれかである可能性があると述べていf<true>()
ますf<1>()
。コンパイラは、 1をtrueに変換しようとするのではなく、完全に一致するものを選択するべきではありませんか?
テンプレート引数の暗黙的な変換は、実際には関数の引数の暗黙的な変換よりも制限的であるという印象を受けました。この問題を回避する方法はありますか?