Во-первых, есть лишние скобки:
template <typename nameOfTheVariableTypeA,
typename nameOfTheVariableTypeB> nameOfTheVariableTypeB functionX
(nameOfTheVariableTypeA argA,
/*(*/nameOfTheVariableTypeB argB)
// Note: extra parenthesis not needed here -----^
{
Предположим, что это просто опечатка, давайте посмотрим первый вызов functionX()
:
functionX(12, 12.4567);
Теперь, шаблонфункции требуют, чтобы все параметры шаблона были указаны до того, как вы сможете их вызвать.Но в некоторых случаях компилятор может определить требуемый тип для nameOfTheVariableTypeA
и nameOfTheVariableTypeB
для вызова функции.
В этом случае 12
является целочисленным литералом, поэтому он имеет тип int
.12.4567
- это литерал с плавающей точкой, поэтому он имеет тип double
.Таким образом, в functionX()
, nameOfTheVariableTypeA
имеет тип int
, а nameOfTheVariableTypeB
имеет тип double
.
Теперь, когда все параметры шаблона были определены (в данном случае выводятся),компилятор может создать функцию шаблона.То есть компилятор создает функцию, которая выглядит следующим образом:
// Hypothetical function generated by the compiler
double functionX_int_double(int argA, double argB)
{
int tempArgA;
double tempArgB;
// ...
Как будто компилятор просто подставляет nameOfTheVariableTypeA
и nameOfTheVariableTypeB
с выведенными типами.Ясно, что аргумент argA
и переменная tempArgA
имеют тип int
.Вы получаете первую ошибку, потому что int
не имеет функции-члена класса с именем push_back()
.По той же причине, по которой это не будет работать:
int i = 20;
i.push_back(22);
Вы также получаете вторую ошибку, потому что оператор индекса 10 * не определен для int
с.Опять же, это та же самая причина, по которой это не сработает:
int j = 21;
cout << j[0];
Обратите внимание, что такую информацию можно почерпнуть из самих ошибок компилятора.Обязательно прочитайте их!