Удаление вперед объявленного класса [дубликат]C++

Программы на C++. Форум разработчиков
Anonymous
Удаление вперед объявленного класса [дубликат]

Сообщение Anonymous »

У меня есть следующая настройка:
foo.h

Код: Выделить всё

class Foo {
public:
Foo();
private:
class Bar;

std::unique_ptr bar_;
};
foo.cc

Код: Выделить всё

class Foo::Bar {
public:
Bar() { // something smart  }
~Bar() = default;
};

Foo::Foo() {  // something smart  }
При запуске модульного теста, который создает и разрушает Foo, компилятор сообщает:

недопустимое приложение от 'sizeof' к неполному типу Foo::Bar

Оказывается, если я добавлю следующее, все будет работать нормально:
foo.h

Код: Выделить всё

class Foo {
public:
~Foo();
};
foo.cc

Код: Выделить всё

Foo::~Foo() = default;
Я хочу понять причину. Почему кажущаяся бесполезной декларация и определение деструктора позволяют всему этому работать?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ared-class

Вернуться в «C++»