在下面的代码中,是避免编译错误并在A.cpp中手动实现移动构造函数/赋值的Bh的唯一方法吗?
// A.h
#include <memory>
class B; // implementation somewhere in B.h/B.cpp
class A
{
public:
A() = default;
~A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
A(A&&) = default;
A& operator=(A&&) = default;
private:
std::unique_ptr<B> m_b;
};
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2015提供了"错误C2027:使用未定义类型",因为std :: unique_ptr的移动构造函数/赋值运算符调用m_b上的删除器(试图调用B的析构函数),这在此时显然是未知的.
Que*_*tin 11
是的,您需要B从实例的任何地方访问完整定义std::unique_ptr<B>::~unique_ptr,因为它需要调用B析构函数.
在您的情况下,这意味着A::~A必须将定义移动到单独的A.cpp文件,其中包括B.h.