2010-04-21 10 views
5
#include <vector> 
#include <memory> 

using namespace std; 

class A { 
public: 
    A(): i(new int) {} 
    A(A const& a) = delete; 
    A(A &&a): i(move(a.i)) {} 

    unique_ptr<int> i; 
}; 

class AGroup { 
public: 
    void     AddA(A &&a) { a_.emplace_back(move(a)); } 

    vector<A> a_; 
}; 

int main() { 
    AGroup ag; 
    ag.AddA(A()); 
    return 0; 
} 

không biên dịch ... (nói rằng của unique_ptr copy constructor sẽ bị xóa)Tôi có thể lấy mã này liên quan đến unique_ptr để biên dịch như thế nào?

tôi đã cố gắng thay thế di chuyển với về phía trước. Không chắc tôi có làm đúng không, nhưng nó không có tác dụng với tôi.


[~/nn/src] g++ a.cc -o a -std=c++0x 
/opt/local/include/gcc44/c++/bits/unique_ptr.h: In member function 'A& A::operator=(const A&)': 
a.cc:6: instantiated from 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]' 
/opt/local/include/gcc44/c++/bits/vector.tcc:100: instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]' 
a.cc:17: instantiated from here 
/opt/local/include/gcc44/c++/bits/unique_ptr.h:219: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>& std::unique_ptr<_Tp, _Tp_Deleter>::operator=(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>]' 
a.cc:6: error: used here 
In file included from /opt/local/include/gcc44/c++/vector:69, 
       from a.cc:1: 
/opt/local/include/gcc44/c++/bits/vector.tcc: In member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]': 
/opt/local/include/gcc44/c++/bits/vector.tcc:100: instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]' 
a.cc:17: instantiated from here 
/opt/local/include/gcc44/c++/bits/vector.tcc:314: note: synthesized method 'A& A::operator=(const A&)' first required here 
+0

Vui lòng bao gồm lỗi. –

+0

đã hoàn tất. (gcc 4.4.0) –

Trả lời

3

lẽ thư viện chuẩn của bạn không (chưa) xác định unique_ptr<T>::unique_ptr(unique_ptr &&). Tôi đã kiểm tra các tiêu đề của mình ở 4,5 và ở đó, vì vậy có thể thử nâng cấp.

Khi không tìm được hàm khởi tạo, nó sẽ tìm kiếm hàm tạo bản sao và tìm nó đã bị xóa.

Tôi gặp phải các lỗi khác khi tôi biên dịch điều đó.

EDIT: OK. Tôi không hiểu lý do tại sao bạn phải move một đối tượng đã là tham chiếu giá trị nhưng bạn đã làm. Vấn đề duy nhất là một nhà điều hành thiếu sót.

#include <vector> 
#include <memory> 

using namespace std; 

class A { 
public: 
    A(): i(new int) {} 
    A(A const& a) = delete; 
    A &operator=(A const &) = delete; 
    A(A &&a): i(move(a.i)) {} 
    A &operator=(A &&a) { i = move(a.i); } 

    unique_ptr<int> i; 
}; 

class AGroup { 
public: 
    void     AddA(A &&a) { a_.emplace_back(move(a)); } 

    vector<A> a_; 
}; 

int main() { 
    AGroup ag; 
    ag.AddA(A()); 
    return 0; 
} 
+0

Chà! Tôi rất biết ơn vì giải pháp của bạn. Điều này làm tôi thất vọng. –

+0

Đã kiểm tra giải pháp của bạn và nó hoạt động. Tôi thực sự muốn toán tử = mặc định sử dụng hàm tạo bản sao trùng khớp. Có lẽ với 'khái niệm tự động', họ sẽ như thế nào? –

+1

Bạn có thể biết nhiều về điều đó hơn tôi; Tôi giải quyết điều này bằng cách là một jockey thông báo lỗi. – Potatoswatter