Речь идет о шаблонах и выводе их аргументов. Параметры шаблонов выводятся из параметров функций, если это возможно. Рассмотрим этот пример:
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;
}
И ЭТО Сработало.
Какую минимальную вещь я пропустил. Означает ли это, что только первый параметр шаблона должен использоваться в качестве возвращаемого значения шаблонов функций.
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.
Порядок аргументов шаблона соответствует порядку параметров шаблона.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.