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 };但是,由于以下原因,出现了编译错误不完整类型:“‘sizeof’对不完整类型‘uixx::window::window_impl’的无效应用”传统上,std::unique_ptr 与不完整类型兼容。那么,问题出在哪里呢?
问题的症结:破坏
关键在于破坏。如果 pimpl 与 unique_ptr 一起使用,则必须显式声明析构函数:class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // Constructor may need external definition ~foo(); // Implement (braceless or with = default;) once impl is complete };如果没有,编译器会生成一个默认析构函数,需要完整声明 foo::impl。
模板问题和静态持续时间实例
使用模板构造函数,即使impl_ 成员未构造:template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction at compile time! }此外,在命名空间范围内使用具有不完整类型的 unique_ptr 会失败:
class impl; std::unique_ptr<impl> impl_;编译器需要知道如何销毁此静态持续时间对象。解决方法包括定义自定义类型:
以上是为什么 Pimpl Idiom 中的'std::unique_ptr”因类型不完整而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!