Вывод типа шаблона функции очень строг.Для каждой пары параметров функции и аргумента вычет происходит изолированно, а затем сравниваются результаты вычета:
[temp.deduct.type]
2 В некоторых случаях вычет выполняется с использованием одного набора типов P и A, в других случаях будет набор соответствующих типов P и A. Вычитание типа выполняется независимо для каждого P / A.пара, и выведенные значения аргумента шаблона затем объединяются.Если выведение типа не может быть выполнено для любой пары P / A, или если для любой пары вычет приводит к более чем одному возможному набору выводимых значений, или если разные пары дают разные выведенные значения, или если какой-либо аргумент шаблона не остается ни выведенным, ни явноуказан, шаблонный вывод аргумента завершается неудачей.
Это означает, что тип x
выводится из 1
(и int), а тип y
выводится из 'b'
(символ), как будто другой параметр не существует.Это вычитание дает T = int
и T = char
по отдельности, и, поскольку это разные типы, вычет должен явно потерпеть неудачу в соответствии с вышеприведенным абзацем.
Если вы хотите вызвать экземплярную функцию, вынеобходимо явно указать T
:
f<int>( 1 , 'b');
f<char>( 1 , 'b');