170 похожих чатов

А помогите ка понять template <class T> struct B; struct A {

B<A> b;
};
template <class T,
typename std::enable_if_t<std::is_same<T, A>::value, bool> = true>
struct B {
A a;
};

вот в случае такой зависимости между типами, как сделать чтобы работало?

33 ответов

21 просмотр

получается ты хочешь в A хранить A?

Нельзя хранить где-то по значению что-то, что ещё не определено. Никак нельзя. Хранимое надо сначала определить. Либо хранить ссылку на хранимое, в любом виде.

Ilya Zviagin
Нельзя хранить где-то по значению что-то, что ещё ...

ага, а такой код почему не работает? 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 {};

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
ага, а такой код почему не работает? template <cla...

И нет, не "работает" :) 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.

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
ага, а такой код почему не работает? template <cla...

А что ты вкладываешь в понятие "код работает" в данном случае ? Это шаблоны, это не классы или фунции, они могут даже компилироваться без инстанциирования (испльзования), ничего не будет плохого

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; }; Ну и главное — если ты не умеешь пока в шаблоны — не используй их, в С++ полно других выразительных средств. Сделай пока на обычном динамическом полиморфизме хотя бы

Ilya Zviagin
template <class T> struct B; // тут написано -- у...

Пуся 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 ` с обеих сторон). Спасибо!

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
Не обратил, обрати больше

Больше не могу, не вижу смысла тратить на это время. всё написал. Что-то другое надо мне делать.

Kirill Bolshakov
А не, скорее всего не должно это работать

не может оно работать без определения B в точке инстанциации B<A>

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
Пуся template <class T> struct B; struct A { void...

тот же абсолютно пример, в конструкторе юзается неполный тип, компилятор пока что не может его размер вычислить

Kirill Bolshakov
У тебя forward declaration не согласован с определ...

Ну это не очень тут важно... Важно, что при агрегации должно быть определение, если идёт инстанциация, то и определение шаблона.

Kirill Bolshakov
Лучше скажи какую задачу ты решаешь, зачем тебе та...

У меня есть классы, компактные тегованый поинтеры, типа. И вот у них информация затирается тоесть они внутри как воид поинтеры , и если надо через методы и инфу о типах с шаблона кастуются адекватно. Плюс ещё инварианты указаны на энейблах. Конструкторы не упоминают типы. Ну и там ещё куча всего

Перепиши свой так : template <class T> struct B; struct A { B<A> *b; }; И всё будет ок...

Попробую ещё и я. Инстанс B<A> содержит внутри поле типа A. A содержит в себе поле типа B<A>, который содержит внутри A, который... Получается что-то такое: B<A> { A { B<A> { A { ... } } } } Эта цепочка никогда не прерывается в вашем случае. Компилятор никогда не дойдёт до её конца Скорее всего, вы запутались в собственных рассуждениях и написали не то, что имели ввиду, но всё ещё не подозреваете об этом

Ofee Oficsu
Попробую ещё и я. Инстанс B<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 ` с обеих сторон). Спасибо!

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
Лучше попробуй на этом template <class T> struct ...

а че чтобы по значению передать чем то отличается от хранения в этом случае?

ǧ̥̹̤̪̉l̜̦̇̈͋a̮͕̭͙̗̓̓͑z̓̏ä͈̟͔́͌͌͋_̤̼̍p̙̘͙̮͑̓̔̃̄r͚͓̰͇ͫ͑̑͒a͕̬͈͋͊̽v
Лучше попробуй на этом template <class T> struct ...

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) {}; };

Kelbon
а че чтобы по значению передать чем то отличается ...

Ну, теперь B не хранит A, в этом вся разница, рекурсии не возникает

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта