LINUX.ORG.RU

Как уже ответили. Это разные типы. Поэтому инстанцируется два разных экземпляра шаблона. Т.е. получается две разных функции. И рекурсии нет.

rumgot ★★★★★
()

Другой вопрос в том, зацикливается компилятор.

rumgot ★★★★★
()

Только в голове веб-макаки int === set<int>. Обколюцца своими динамическими типизациями и…

BceM_IIpuBeT ★★☆☆☆
()
Последнее исправление: BceM_IIpuBeT (всего исправлений: 2)
Ответ на: комментарий от rumgot

Ну компилятор на самом деле не зациклится конечно, но текст ошибки тебе понравится. Там будет что-то типа не могу скастовать set<set<set…[глубина рекурсии] в set<set<set…[глубина рекурсии минус один]. На дефолтной настройке это займет несколько десятков страниц.

filosofia
()
Ответ на: комментарий от rumgot
// $ cat recursion.cc 
#include <cstdio>

template <int N> struct Number {
    enum { value = 1 + Number<N - 1>::value };
};

template <> struct Number<0>
{
    enum { value = 0 };
};

int main()
{
    int n = Number<2048>::value;

    printf("Number: %d\n", n);

    return 0;
}
$ g++ recursion.cc -o rec                      
recursion.cc: In instantiation of ‘struct Number<1149>’:
recursion.cc:4:22:   recursively required from ‘struct Number<2047>’
recursion.cc:4:22:   required from ‘struct Number<2048>’
recursion.cc:14:25:   required from here
recursion.cc:4:22: fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
     enum { value = 1 + Number<N - 1>::value };
                    ~~^~~~~~~~~~~~~~~
compilation terminated.

$ g++ recursion.cc -o rec -ftemplate-depth=2049
$ ./rec 
Number: 2048

К слову, шланг во втором вызове валится в сегфолт ¯\_(ツ)_/¯

hateyoufeel ★★★★★
()
Ответ на: комментарий от filosofia

Ну компилятор на самом деле не зациклится конечно, но текст ошибки тебе понравится.

Текст ошибки весьма короток и лаконичен. Если не считать шланга, которому оторвало днище сегфолтом.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Попробуй скомпилируй такой код:

#include <set>

template<typename T>
std::set<T> foo() {
    return foo<std::set<T>>();
}

int main() {
    foo<std::set<int>>();
    return 0;
}

Мой clang срет кирпичами.

filosofia
()
Ответ на: комментарий от rumgot

А как по твоему переписать код ТС-а, чтобы не было рекурсии?

А что код ТС-а должен делать? Кроме как выдавать ошибку при компиляции.

hateyoufeel ★★★★★
()
Ответ на: комментарий от filosofia

По дефолту то же, только у шланга template-depth=1024, поэтому так много срани. Тащемта, это первый параметр который я ставлю в минимум если при компиляции вылезает что-то больше 20 строк.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

мы на котлине рекурсии делаем куда более простыми и читаемыми способами. ведь все знают насколько лаконичен код на котлине!

der_looser ★★
()

Древние сказания говорят, что темплейты в плюсах – отдельный язык, на котором можно всё.

DonkeyHot ★★★★★
()
Ответ на: комментарий от der_looser

Котлин классный язык, это да.

Основная особенность которого - любая опечатка компилируется.

Наверное, вывод генератора случайных символов тоже скомпилируется, нужно будет попробовать.

Dimentiy ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.