Новичкам в C++ может быть не очевидно, почему не работает вот такой код:
#include <boost/scoped_ptr.hpp>
class TestPimpl;
class Test {
public:
Test();
private:
boost::scoped_ptr<TestPimpl> pimpl;
};
А причина в том, что компилятор сам создает деструктор, в котором потребуется вызов деструктора TestPimpl. Но TestPimpl в области видимости не присутствует, поэтому вызвать его деструктор не представляется возможным. Для решения проблемы следует указать пользовательский деструктор:
class TestPimpl;
class Test {
public:
Test();
~Test();
private:
boost::scoped_ptr<TestPimpl> pimpl;
};
и в .cpp файле:
class TestImpl {
...
}
Test::~Test()
{
}
Теперь TestImpl определен в области видимости и его деструктор может быть вызван.