Size: a a a

2020 August 17

A

Alex in pro.cxx
Anton Lashkov
Дефолтный конструктор B компилятор добавляет в hpp, в нем вызывается конструктор unique_ptr, а в нем создается делетер. Тип неполный - ошибка.
Хммм, вот теперь начинает вырисовываться. А в месте инстанциации делетера инстанциируется и обращение к деструктору А, поэтому конструирование unique_ptr и требует complete type?
источник

AT

Andrew Titov in pro.cxx
Но ведь на этапе компоновки деструктор всё равно найдётся, не?
источник

A

Alex in pro.cxx
да, но до этого этапа не доходит, это ошибка именно компиляции
источник

AK

Andrei K in pro.cxx
Alex
Прочитал, спасибо, но мне это ничего не объяснило
Место в котором создаётся дефолтный конструктор для класса B — это файл b.hpp. Дефолтный конструктор класса B должен сконструировать юник_птр. Чтобы сконструировать юник_птр, требуется определение типа A, поскольку из него нужен деструктор.
источник

AT

Andrew Titov in pro.cxx
А почему добавление конструктора B как-то влияет на A?
источник

AK

Andrei K in pro.cxx
Andrew Titov
А почему добавление конструктора B как-то влияет на A?
Потому что ОПРЕДЕЛЕНИЕ конструктора  B по дефолту находится в b.hpp, где класс А не определён.
источник

AT

Andrew Titov in pro.cxx
А где он найдётся в b.cpp?!
источник

A

Alex in pro.cxx
Andrew Titov
А где он найдётся в b.cpp?!
а туда он включен, в b.cpp тип А полный
источник

AK

Andrei K in pro.cxx
Добавление конструктора И перенос его в b.cpp делаёт всё валидным, потому что в b.cpp A уже определён.
источник

A

Alex in pro.cxx
Andrei K
Добавление конструктора И перенос его в b.cpp делаёт всё валидным, потому что в b.cpp A уже определён.
Но деструктор В всё равно тоже должен быть в .срр? Или только конструктор?
источник

AK

Andrei K in pro.cxx
Так-то просто конструктор добавить в b.hpp не помогло бы. Поинт в том, чтобы определить его там, где A определено.
источник

AK

Andrei K in pro.cxx
Alex
Но деструктор В всё равно тоже должен быть в .срр? Или только конструктор?
По-моему тоже в b.cpp
источник

AK

Andrei K in pro.cxx
Иначе опять в main.cpp получится incomplete type по той же самой причине.
источник

A

Alex in pro.cxx
Andrei K
Иначе опять в main.cpp получится incomplete type по той же самой причине.
да, эксперимент подтверждает, хотя я теперь снова не уверен, что понял) Если вызов деструктора А инстанциируется в делетере, который инстанциируется в конструкторе, то не должен ли деструктор уже быть до лампочки?
источник

AT

Andrew Titov in pro.cxx
Alex
а туда он включен, в b.cpp тип А полный
Ух... теперь понял.

Зря ты #include изначально не дописал. :)
источник

A

Alex in pro.cxx
но я быстро исправился! Это просто опечатка, по задумке он там быть обязан
источник

A

Alex in pro.cxx
Спасибо всем за объяснения
источник

AT

Andrew Titov in pro.cxx
Alex
да, эксперимент подтверждает, хотя я теперь снова не уверен, что понял) Если вызов деструктора А инстанциируется в делетере, который инстанциируется в конструкторе, то не должен ли деструктор уже быть до лампочки?
Так в b.hpp всё ещё нет ~A.
источник

A

Alex in pro.cxx
именно в этом и смысл, чтобы его там не было)
источник

A

Alex in pro.cxx
иначе можно вообще не напрягаться с forward declaration
источник