以下是一些std::unique_ptr
类型不完整的示例。问题在于破坏。
如果将pimpl与一起使用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 !
}
在名称空间范围内,使用unique_ptr
将不起作用:
class impl;
std::unique_ptr<impl> impl_;
因为编译器必须在这里知道如何销毁此静态工期对象。解决方法是:
class impl;
struct ptr_impl : std::unique_ptr<impl>
{
~ptr_impl(); // Implement (empty body) elsewhere
} impl_;