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