我将 pimpl-idiom 与 std::unique_ptr
一起使用:
class window {
window(const rectangle& rect);
private:
class window_impl; // defined elsewhere
std::unique_ptr<window_impl> impl_; // won't compile
};
但是,我在 <memory>
的第 304 行收到关于使用不完整类型的编译错误:
’
sizeof
‘对不完整类型’uixx::window::window_impl
‘的无效应用
据我所知, std::unique_ptr
应该能够与不完整的类型一起使用。这是 libc++ 中的错误还是我在这里做错了什么?
原文由 user1203803 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下是一些
std::unique_ptr
类型不完整的示例。问题在于破坏。如果将 pimpl 与
unique_ptr
一起使用,则需要声明一个析构函数:因为否则编译器会生成一个默认值,为此它需要一个完整的
foo::impl
声明。如果您有模板构造函数,那么即使您不构造
impl_
成员,您也会被搞砸:在命名空间范围内,使用
unique_ptr
也不起作用:因为编译器必须知道如何销毁这个静态持续时间对象。一种解决方法是: