#c #function #templates #standards #overload-resolution
Вопрос:
struct A {};
template<typename T>
void f(int n, T m = 3.14159)
{}
int main()
{
f(8, A{}); // ok
f(8); // error: no matching function for call to 'f'
}
Смотрите онлайн-демонстрацию
Почему аргумент по умолчанию не работает в функции шаблона?
РЕДАКТИРОВАТЬ: Я также попытался следовать, и удивляюсь, почему это тоже не сработало.
void g(int, auto = 3.14159)
{}
Комментарии:
1. Как он должен определять тип параметра шаблона
T
во втором вызове?2. Попробуйте также указать тип параметра шаблона по умолчанию
double
.3. Пожалуйста, не меняйте свой вопрос после получения ответа.
4. Вы полностью изменили вопрос с помощью этой последней правки….
5. Я откатил ваш вопрос назад, чтобы ответы имели смысл. Если у вас есть новый вопрос, задайте, пожалуйста, новый вопрос.
Ответ №1:
Аргументы функции по умолчанию не влияют на вывод аргументов шаблона.
Вам также нужен аргумент по умолчанию для параметра шаблона: typename T = double
.
Что касается void g(int, auto = 3.14159)
, то, похоже, нет никакого способа это исправить.
Комментарии:
1. Как насчет
auto
формы, а неtemplate
формы? Смотрите обновленный код.2. @xmllmx Это кажется невозможным.
3.
auto
Версия по существу эквивалентна версии шаблона с теми же проблемами, но без соответствующего решения, поскольку вы не можете указать тип по умолчанию дляauto
.
Ответ №2:
В первом случае вы задали значение для второго параметра функции на сайте вызова, которое компилятор мог бы использовать для вывода типа второго аргумента шаблона, который затем позволил бы ему определить, какую версию шаблона создавать и вызывать.
Во втором случае вы не предоставили компилятору никакой информации о типе для второго аргумента шаблона, поэтому он не может использовать шаблон для создания экземпляра функции, и поэтому функция с этой сигнатурой недоступна для вызова.
Компилятор не будет использовать значение параметра по умолчанию для вывода типа аргумента шаблона для этого параметра (имейте в виду, что потенциально многие варианты выбора типа T
могут принимать a double
в качестве значения по умолчанию).