B<A> b;
};
template <class T,
typename std::enable_if_t<std::is_same<T, A>::value, bool> = true>
struct B {
A a;
};
вот в случае такой зависимости между типами, как сделать чтобы работало?
получается ты хочешь в A хранить A?
Нельзя хранить где-то по значению что-то, что ещё не определено. Никак нельзя. Хранимое надо сначала определить. Либо хранить ссылку на хранимое, в любом виде.
ага, а такой код почему не работает? template <class T> struct B; struct A { void b(B<A> t) {}; }; template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> struct B {};
Интересно конечно enable_if в шаблоне класса использовать)
И нет, не "работает" :) x.cpp:4:24: error: implicit instantiation of undefined template 'B<A>' struct A { void b(B<A> t) {}; }; ^ x.cpp:3:8: note: template is declared here struct B; ^ x.cpp:5:1: error: too many template parameters in template redeclaration template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ x.cpp:2:1: note: previous template declaration is here template <class T> ^~~~~~~~~~~~~~~~~~ 2 errors generated.
А, я прочитал неправильно
А что ты вкладываешь в понятие "код работает" в данном случае ? Это шаблоны, это не классы или фунции, они могут даже компилироваться без инстанциирования (испльзования), ничего не будет плохого
template <class T> struct B; // тут написано -- у меня будет какой-то шаблон класса с одним шаблонным параметром. struct A { B<A> b; // тут ты пишешь -- я хочу инстанциировать мой шаблон B, который я ещё не определил, и положить этот инстанс шаблона по значению в A // ТАК БЛ... ШАБЛОН КЛАССА B ДОЛЖЕН БЫТЬ ТУТ ОПРЕДЕЛЁН !!! }; // ЭТОТ КОД УЖЕ НЕ СУЩЕСТВЕНЕН ДЛЯ РАССМОТРЕНИЯ template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> struct B { A a; }; Ну и главное — если ты не умеешь пока в шаблоны — не используй их, в С++ полно других выразительных средств. Сделай пока на обычном динамическом полиморфизме хотя бы
Возможно потому что ты старый компилятор юзаешь
Пуся template <class T> struct B; struct A { void b(B<A> t) {}; }; template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> struct B {};
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Да уже обратил, написал тебе выше всё.
А у тебя заработало? Я на 17х крестах
Не обратил, обрати больше
А не, скорее всего не должно это работать
Больше не могу, не вижу смысла тратить на это время. всё написал. Что-то другое надо мне делать.
не может оно работать без определения B в точке инстанциации B<A>
У тебя forward declaration не согласован с определением уже
тот же абсолютно пример, в конструкторе юзается неполный тип, компилятор пока что не может его размер вычислить
Ну это не очень тут важно... Важно, что при агрегации должно быть определение, если идёт инстанциация, то и определение шаблона.
Лучше скажи какую задачу ты решаешь, зачем тебе такое надо?
Где ты тут конструктор увидел?
У меня есть классы, компактные тегованый поинтеры, типа. И вот у них информация затирается тоесть они внутри как воид поинтеры , и если надо через методы и инфу о типах с шаблона кастуются адекватно. Плюс ещё инварианты указаны на энейблах. Конструкторы не упоминают типы. Ну и там ещё куча всего
Перепиши свой так : template <class T> struct B; struct A { B<A> *b; }; И всё будет ок...
Попробую ещё и я. Инстанс B<A> содержит внутри поле типа A. A содержит в себе поле типа B<A>, который содержит внутри A, который... Получается что-то такое: B<A> { A { B<A> { A { ... } } } } Эта цепочка никогда не прерывается в вашем случае. Компилятор никогда не дойдёт до её конца Скорее всего, вы запутались в собственных рассуждениях и написали не то, что имели ввиду, но всё ещё не подозреваете об этом
Лучше попробуй на этом template <class T> struct B; struct A { void b(B<A> t) {}; }; template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> struct B {};
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
а че чтобы по значению передать чем то отличается от хранения в этом случае?
struct A; template <class T, typename std::enable_if_t<std::is_same<T, A>::value, bool> = true> struct B {}; struct A { void b(B<A> t) {}; };
Ну, теперь B не хранит A, в этом вся разница, рекурсии не возникает
одной проблемой меньше
Обсуждают сегодня