"使用undefined类型"与unique_ptr转发声明的类和默认的移动构造函数/赋值

Rob*_*ert 7 c++ c++11

在下面的代码中,是避免编译错误并在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.

  • 需要明确的是,〜A()= default;可以作为A ::〜A()= default;移入cpp文件;-无需手动实现。对于此问题的任何其他方法都相同。 (2认同)