我正在使用 pimpl-idiom std::unique_ptr:
std::unique_ptr
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
但是,我在第 304 行中收到关于使用不完整类型的编译错误<memory>:
<memory>
sizeof‘ ‘ 对不完整类型 ‘ uixx::window::window_impl‘的无效应用
sizeof
uixx::window::window_impl
据我所知,std::unique_ptr应该可以与不完整的类型一起使用。这是 libc++ 中的错误还是我在这里做错了什么?
以下是一些std::unique_ptr不完整类型的示例。问题在于破坏。
如果你使用 pimpl with unique_ptr,你需要声明一个析构函数:
unique_ptr
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // You may need a def. constructor to be defined elsewhere ~foo(); // Implement (with {}, or with = default;) where impl is complete };
因为否则编译器会生成一个默认的,它需要一个完整的声明foo::impl。
foo::impl
如果你有模板构造函数,那么即使你不构造impl_成员,你也会被搞砸:
impl_
template <typename T> foo::foo(T bar) { // Here the compiler needs to know how to // destroy impl_ in case an exception is // thrown ! }
在命名空间范围内, usingunique_ptr也不起作用:
class impl; std::unique_ptr<impl> impl_;
因为编译器必须知道如何销毁这个静态持续时间对象。一种解决方法是:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;