Bây giờ, tôi biết các vấn đề chung với unique_ptr <> và chuyển tiếp các khai báo như trong Forward declaration with unique_ptr?.Không thể sử dụng tiêu chuẩn :: unique_ptr <T> với T là khai báo chuyển tiếp
Hãy xem xét ba tập tin:
A.h
#include <memory>
#include <vector>
class B;
class A
{
public:
~A();
private:
std::unique_ptr<B> m_tilesets;
};
C.cpp
#include "A.h"
class B {
};
A::~A() {
}
main.cpp
#include <memory>
#include "A.h"
int main() {
std::unique_ptr<A> m_result(new A());
}
Phát hành g++ -std=c++11 main.cpp C.cpp
sản lượng các lỗi sau:
In file included from /usr/include/c++/4.8/memory:81:0,
from main.cpp:1:
/usr/include/c++/4.8/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = B]’:
/usr/include/c++/4.8/bits/unique_ptr.h:184:16: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = B; _Dp = std::default_delete<B>]’
A.h:6:7: required from here
/usr/include/c++/4.8/bits/unique_ptr.h:65:22: error: invalid application of ‘sizeof’ to incomplete type ‘B’
static_assert(sizeof(_Tp)>0,
Đó là sự thật, B là loại không đầy đủ trong dòng 6 của A.h - nhưng đó không phải là nơi hủy diệt của A! g ++ dường như tạo ra một destructor cho A mặc dù tôi đang cung cấp một. A destructor là trong C.cpp dòng 7 và có B là một loại được xác định hoàn hảo. Tại sao tôi nhận được lỗi này?
Cùng xảy ra btw cho các nhà xây dựng di chuyển, nếu nó không được ngầm định nghĩa là xóa vì destructor rõ ràng-tuyên bố. (Và bản sao ctor được định nghĩa là bị xóa cũng vì không thể sao chép 'unique_ptr'.) – dyp