C++ &引用;“未定义类型的使用”;使用唯一的\u ptr转发声明的类和默认的移动构造函数/赋值

C++ &引用;“未定义类型的使用”;使用唯一的\u ptr转发声明的类和默认的移动构造函数/赋值,c++,c++11,C++,C++11,在下面的代码中,是避免编译错误并在a.cpp中包含手动实现移动构造函数/赋值的B.h的唯一方法吗 // 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&

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

// 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;
};
//A.h
#包括
B类;//在B.h/B.cpp中的某处实现
甲级
{
公众:
A()=默认值;
~A()=默认值;
A(常数A&)=删除;
A&运算符=(常量A&)=删除;
A(A&&)=默认值;
A&运算符=(A&&)=默认值;
私人:
std::唯一的ptr m_b;
};

Visual Studio 2015给出了“错误C2027:未定义类型的使用”,因为std::unique_ptr的移动构造函数/赋值运算符调用m_b上的删除器(尝试调用b的析构函数),这显然是目前未知的。

是,您需要从实例化
std::unique\u ptr::~unique\u ptr
的任何位置访问
B
的完整定义,因为它需要调用
B
的析构函数


在您的情况下,这意味着
A::~A
的定义必须移动到一个单独的
A.cpp
文件中,其中包括
B.h

相关/dup:I实际上不知道您也可以在.cpp中设置默认值。我认为这是申报时需要的。因此,处理我的具体案例的正确方法就是将move构造函数声明为(A&&)noexcept;在A.h中,并将其定义为A::A(A&&)noexcept=default;在A.cpp中。谢谢这听起来是个好主意。这是一个比我所接受的答案更好的解决方案。要清楚,
~a()=default可以作为
A::~A()=默认值移动到cpp文件中-无需手动实现。与此问题的任何其他方法相同。