Есть код:
#include <iostream>
template <typename T>
long double sum(const T& val)
{
return static_cast<long double>(val);
}
template <typename T, typename... Args>
long double sum(const T& val, const Args&... args)
{
return static_cast<long double>(val) + sum(args...);
}
int main()
{
using namespace std;
cout << sum(1, 2.0, 3.0L, 4.0f, 5ULL) << endl;
return 0;
}
который компилируется и выполняется без ошибок. Но стоит изменить порядок определений функций, вот так:
#include <iostream>
template <typename T, typename... Args>
long double sum(const T& val, const Args&... args)
{
return static_cast<long double>(val) + sum(args...);
}
template <typename T>
long double sum(const T& val)
{
return static_cast<long double>(val);
}
int main()
{
using namespace std;
cout << sum(1, 2.0, 3.0L, 4.0f, 5ULL) << endl;
return 0;
}
и сразу получаем ошибки компиляции, что нет подходящих перегрузок и что sum
ожидает два аргумента, а получает ноль аргументов. Почему так присходит?
Во втором случае перегрузка sum
, принимающая один аргумент (и тем самым самым останавливающая рекурсию на шаге вызова sum
с одним аргументом) еще не является объявленной в при вызове sum(args...)
, соответственно рекурсия завершается ошибкой на шаге вызова sum
без аргументов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Создать файл из N целых чиселНайти отрезок массива максимальной длины, в котором первое число равно последнему, второе - предпоследнему...
Ввод, вывод и main в других файлахНо там нет ошибок