将 std::unique_ptr 与不完整类型一起使用
在 pimpl 习惯用法中,将 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 引起的,如
问题
问题源于这样一个事实:编译器需要知道不完整类型的大小来确定 std:: 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 };
通过实现析构函数,编译器获得了处理 unique_ptr 销毁所需的知识。
特殊情况
在某些场景下,使用不完整类型的 unique_ptr 可能不可行可能:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
通过遵循这些准则,您可以有效地使用不完整类型的 unique_ptr,确保编译过程顺利。
以上是如何在 C 中将 `std::unique_ptr` 与不完整类型一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!