带有不完整类型编译错误的 std::unique_ptr
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 };
可能会出现有关使用不完整类型的编译错误。这个错误源于这样一个事实:当 pimpl 与 std::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 类的声明。在处理不完整类型时,这可能会导致编译错误。
要解决此问题,请为该类实现一个析构函数,可以使用空主体,也可以将其设置为默认值,如上面的代码片段所示。这将确保编译器可以正确处理由 std::unique_ptr 管理的对象的销毁。
此外,在命名空间范围内不支持使用具有不完整类型的 std::unique_ptr。相反,可以通过将 std::unique_ptr 包装在提供析构函数的自定义结构中来获得解决方法,如下面的代码片段所示:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
以上是为什么使用带有不完整类型的 std::unique_ptr 会导致编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!