Есть код:
#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
без аргументов.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Создать файл из N целых чиселНайти отрезок массива максимальной длины, в котором первое число равно последнему, второе - предпоследнему...
Ввод, вывод и main в других файлахНо там нет ошибок