具有不完整类型的std :: unique_ptr将无法编译

具有不完整类型的std :: unique_ptr将无法编译

我正在使用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行的第304行收到有关使用不完整类型的编译错误<memory>

sizeof'到不完整类型' uixx::window::window_impl的应用无效' '

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


郎朗坤
浏览 857回答 2
2回答

精慕HU

以下是一些std::unique_ptr不完整类型的示例。问题在于破坏。如果你使用pimpl&nbsp;unique_ptr,你需要声明一个析构函数:class&nbsp;foo{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;impl; &nbsp;&nbsp;&nbsp;&nbsp;std::unique_ptr<impl>&nbsp;impl_;public: &nbsp;&nbsp;&nbsp;&nbsp;foo();&nbsp;//&nbsp;You&nbsp;may&nbsp;need&nbsp;a&nbsp;def.&nbsp;constructor&nbsp;to&nbsp;be&nbsp;defined&nbsp;elsewhere &nbsp;&nbsp;&nbsp;&nbsp;~foo();&nbsp;//&nbsp;Implement&nbsp;(with&nbsp;{},&nbsp;or&nbsp;with&nbsp;=&nbsp;default;)&nbsp;where&nbsp;impl&nbsp;is&nbsp;complete};因为否则编译器会生成一个默认值,并且需要完整的声明foo::impl。如果你有模板构造函数,那么即使你没有构造impl_成员,你也搞砸了:template&nbsp;<typename&nbsp;T>foo::foo(T&nbsp;bar)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Here&nbsp;the&nbsp;compiler&nbsp;needs&nbsp;to&nbsp;know&nbsp;how&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;destroy&nbsp;impl_&nbsp;in&nbsp;case&nbsp;an&nbsp;exception&nbsp;is &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;thrown&nbsp;!}在命名空间范围内,使用unique_ptr将不起作用:class&nbsp;impl;std::unique_ptr<impl>&nbsp;impl_;因为编译器必须知道如何销毁这个静态持续时间对象。解决方法是:class&nbsp;impl;struct&nbsp;ptr_impl&nbsp;:&nbsp;std::unique_ptr<impl>{ &nbsp;&nbsp;&nbsp;&nbsp;~ptr_impl();&nbsp;//&nbsp;Implement&nbsp;(empty&nbsp;body)&nbsp;elsewhere}&nbsp;impl_;
打开App,查看更多内容
随时随地看视频慕课网APP