Здравствуйте, Videoman, Вы писали:
S>>- не компилируется. unique_ptr хочет заранее знать какой класс даже в этом случае, не смотря на то, что конструктор только декларирован — ему пофиг.
V>Потому что дело не только в конструкторе, но и в деструкторе. std::unique_ptr<Class2> деструктор для неполного объекта также не может создать. С деструктором Class1 проделай тоже самое:
Емнип, у Visual C++ была похожее поведение — если не объявлять деструктор явно, то генерировалась inline версия:
// test.hpp
сlass Class2;
class Class1 {
std::unique_ptr<Class2> ptr;
// нет явного ~Class1(), так что компилятор создает inline версию
// в которой пытается вызывать деструктор Class2
};
Мне лень искать подтверждение, насколько это соответсвует стандарту.
Исправление — объявить деструктор в классе, определить в реализации:
// test.hpp
сlass Class2;
class Class1 {
std::unique_ptr<Class2> ptr;
~Class1();
};
// test.cpp
#include "test.hpp"
class Class2 {}; // полное определение нужно в любом случае
Class1::~Class1() = default; // достаточно сгенерированной версии, главное чтобы Class2 был здесь доступен