Я вдохновил себя на несколько статей, которые всегда выделяют тот же важный момент: только объявляйте деструктор в заголовке класса, реализующего Pimpl, а затем определяет его в файле .cpp. В противном случае вы получите ошибку компиляции, такую как «неполный тип Bla Bla». Код чуть ниже, он очень короткий.
Код: Выделить всё
#pragma once
#include
class A
{
public:
A();
~A();
private:
class B;
std::unique_ptr m_b = nullptr;
};
< /code>
a.cpp:
#include "A.hpp"
class A::B
{
};
A::A()
{
}
A::~A() // could be also '= default'
{
}
< /code>
main.cpp:
#include "A.hpp"
int main()
{
A a1;
return 0;
}
< /code>
Я встроил 2 (быстрые и грязные) способы, и результат очень удивителен с моей точки зрения.g++ -c A.cpp
< /code>
Нет ошибки до сих пор. < /p>
Затем я собрал a.cpp и main.cpp для создания исполняемого: < /p>
g++ A.cpp main.cpp -o test
< /code>
Вот где я увлекаюсь неприятностями. Здесь я получил знаменитую ошибку о неполном типе: < /p>
In file included from /usr/include/c++/9/memory:80,
from A.hpp:2,
from test.cpp:2:
/usr/include/c++/9/bits/unique_ptr.h: In instantiation of ‘void std::default_delete::operator()(_Tp*) const [with _Tp = A::B]’:
/usr/include/c++/9/bits/unique_ptr.h:292:17: required from ‘std::unique_ptr::~unique_ptr() [with _Tp = A::B; _Dp = std::default_delete]’
A.hpp:11:28: required from here
/usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incomplete type ‘A::B’
79 | static_assert(sizeof(_Tp)>0,
| ^~~~~~~~~~~
Я делаю что -то не так, или мы просто не подвергаются CENS, чтобы использовать unique_ptr в таком случае?
>
Подробнее здесь: https://stackoverflow.com/questions/713 ... unique-ptr