小编典典

类型不完整的 std::unique_ptr 不会编译

all

我正在使用 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
};

但是,我在第 304 行中收到关于使用不完整类型的编译错误<memory>

sizeof‘ ‘ 对不完整类型 ‘ uixx::window::window_impl‘的无效应用

据我所知,std::unique_ptr应该可以与不完整的类型一起使用。这是 libc++ 中的错误还是我在这里做错了什么?


阅读 92

收藏
2022-05-27

共1个答案

小编典典

以下是一些std::unique_ptr不完整类型的示例。问题在于破坏。

如果你使用 pimpl with 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

如果你有模板构造函数,那么即使你不构造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_;
2022-05-27