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

时间:2016-11-02 15:10:42

标签: c++ c++11

在下面的代码中,是避免编译错误并包含B.h在A.cpp中手动实现移动构造函数/赋值的唯一方法吗?

// 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;
};

Visual Studio 2015提供“错误C2027:使用未定义类型”,因为std :: unique_ptr的移动构造函数/赋值运算符调用m_b上的删除器(试图调用B的析构函数),这在此处显然是未知的

1 个答案:

答案 0 :(得分:10)

是的,您需要访问B的完整定义,因为它需要调用std::unique_ptr<B>::~unique_ptr的析构函数。

在您的情况下,这意味着必须将B的定义移至单独的A::~A文件,其中包含A.cpp