Речь идет о шаблонах и выводе их аргументов. Параметры шаблонов выводятся из параметров функций, если это возможно. Рассмотрим этот пример:

template <class D, class T>
T Max(D, double);

template <class D, class T>
T Max(D a, double b) {
  return (a>b ? a : b); 
}   

int main() {
  std::cout << Max<double>(1,2.1) << std::endl;
}

Я ожидал, что это сработает на основе того, что первый параметр Макса будет выведен как int, который перейдет к D, а второй параметр Макса явно задан как double. И так как я хочу вернуть double, не будет ли это параметром шаблона «T»? Я ожидал, что компилятор будет работать здесь. Вместо этого он дал:

In function ‘int main()’:
error: no matching function for call to ‘Max(int, double)’

Однако затем я изменил порядок и сделал программу такой:

Шаблон T Max(D, двойной);

template <class T, class D>
T Max(D a, double b) {
  return (a>b ? a : b);
}

int main() {
  std::cout << Max<double>(1,2.1) << std::endl;
}

И ЭТО Сработало.

Какую минимальную вещь я пропустил. Означает ли это, что только первый параметр шаблона должен использоваться в качестве возвращаемого значения шаблонов функций.

0
Hemant Bhargava 26 Апр 2020 в 00:34

1 ответ

В этом звонке

Max<double>(1,2.1)

Следующей шаблонной функции

template <class D, class T>
T Max(D a, double b) {
  return (a>b ? a : b); 
} 

Вы явно указали, что параметр шаблона D имеет тип double. Итак, это тип первого параметра функции, но вы ничего не указали для параметра шаблона T. И компилятор не может определить тип параметра шаблона T в выражении вызова функции.

Вы могли бы написать, например,

std::cout << Max<double, double>(1,2.1) << std::endl; 

Указав, что параметр типа шаблона T имеет тип double.

Для этой декларации

template <class T, class D>
T Max(D a, double b) {
  return (a>b ? a : b);
}

Компилятор, использующий это выражение

Max<double>(1,2.1)

Может вывести параметр типа D к типу int. Аргумент шаблона double используется для параметра типа шаблона T.

Порядок аргументов шаблона соответствует порядку параметров шаблона.

1
Vlad from Moscow 26 Апр 2020 в 00:52