Чтобы компилятор мог вывести параметр шаблона A
из аргументов, переданных в шаблон функции, оба аргумента a
и b
должны иметь одинаковый тип.
Ваши аргументы имеют тип int
и double
, поэтому компилятор не может определить, какой тип он должен использовать для A
. A
должно быть int
или double
?
Это можно исправить, указав оба аргумента одного типа:
printMax(1.0, 14.45);
или явно указав параметр шаблона:
printMax<double>(1, 14.45);
Причина, по которой можно вызвать вызов не шаблонной функции, заключается в том, что компилятору не нужно определять тип параметров: он знает тип параметров, потому что вы сказали, что они были в объявлении функции:
void printMaxInts(int a, int b)
Оба a
и b
имеют тип int
. Когда вы передаете double
в качестве аргумента этой функции, стандартное преобразование double -> int
выполняется для аргумента, и функция вызывается с полученным int
.