Вариативные шаблоны

89
01 января 2022, 14:50

Есть код:

#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 ожидает два аргумента, а получает ноль аргументов. Почему так присходит?

Answer 1

Во втором случае перегрузка sum, принимающая один аргумент (и тем самым самым останавливающая рекурсию на шаге вызова sum с одним аргументом) еще не является объявленной в при вызове sum(args...), соответственно рекурсия завершается ошибкой на шаге вызова sum без аргументов.

READ ALSO
Поиск палиндрома максимальной длины

Поиск палиндрома максимальной длины

Создать файл из N целых чиселНайти отрезок массива максимальной длины, в котором первое число равно последнему, второе - предпоследнему...

184
Run-Time Check Failure #3 - The variable &#39;r&#39; is being used without being initialized

Run-Time Check Failure #3 - The variable 'r' is being used without being initialized

Ввод, вывод и main в других файлахНо там нет ошибок

194
Вывод в два столбца

Вывод в два столбца

Как сделать вывод в два столбца с помощью цикла do while

73