Есть код:
#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 без аргументов.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости