Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
От: PM  
Дата: 05.07.23 21:51
Оценка:
Здравствуйте, 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 был здесь доступен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.