2016-11-02 83 views
4

在下面的代碼中,是避免編譯錯誤幷包含Bh的唯一方法,它在A.cpp中手動實現移動構造函數/賦值?「使用未定義類型」和unique_ptr轉發已聲明的類和默認的移動構造函數/賦值

// 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的析構函數),這顯然是不在這一點上已知。

+2

相關/ dup:http://stackoverflow.com/questions/13414652/forward-declaration-with-unique-ptr – NathanOliver

+3

我其實也不知道你也可以在.cpp中默認。我認爲這是需要申報的。因此,處理我的具體情況的正確方法就是將移動構造器聲明爲A(A &&)noexcept;在A.h中並將其定義爲A :: A(A &&)noexcept = default;在A.cpp。謝謝! – Robert

+0

這聽起來像個好主意。 – NathanOliver

回答

6

是的,您需要訪問B的完整定義,因爲它需要調用B的析構函數。

就你而言,這意味着A::~A的定義必須移至單獨的A.cpp文件,其中包括B.h

相關問題