Если вы перегружаете функцию, а затем вызываете ее с аргументом, который точно соответствует одной из перегруженных версий
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
, либо f<1>()
. Разве компилятор не должен просто выбрать идеальное совпадение вместо того, чтобы пытаться преобразовать 1в true?
У меня сложилось впечатление что неявное преобразование для аргументов шаблона на самом деле было более ограничивающим, чем неявное преобразование аргументов функции.Есть ли способ обойти эту проблему?