2013-06-18 20 views
6

Tôi có mã này để khởi tạo bản đồ từ thành unique_ptr.Làm thế nào để đồng bộ khởi tạo bản đồ của unique_ptr?

auto a = unique_ptr<A>(new A()); 
map<int, unique_ptr<A>> m; 
m[1] = move(a); 

Tôi có thể sử dụng đồng bộ khởi tạo điều này không? Tôi đã thử

map<int, unique_ptr<A>> m {{1, unique_ptr<A>(new A())}};  

Nhưng tôi gặp lỗi.

Một số phần của thông báo lỗi là

In instantiation of 'std::_Rb_tree_node<_Val>::_Rb_tree_node(_Args&& ...) [with _Args = {const std::pair<const int, std::unique_ptr<A, std::default_delete<A> > >&}; _Val = std::pair<const int, std::unique_ptr<A> >]': ... In file included from /opt/local/include/gcc48/c++/memory:81:0, 
       from smart_pointer_map.cpp:3: /opt/local/include/gcc48/c++/bits/unique_ptr.h:273:7: error: declared here 
     unique_ptr(const unique_ptr&) = delete; 

^
+0

Lỗi là gì? Chương trình có gặp sự cố khi bạn chạy chương trình không? –

+0

có thể trùng lặp của [Tại sao tôi không thể đẩy \ _back duy nhất \ _ptr vào một vectơ?] (Http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique- ptr-in-a-vector) –

Trả lời

7

unique_ptr là di chuyển, nhưng không copyable. initializer_list yêu cầu loại có thể sao chép; bạn không thể di chuyển thứ gì đó ra khỏi số initializer_list. Thật không may, tôi tin rằng những gì bạn muốn làm là không thể.

Ngẫu nhiên, sẽ hữu ích nếu bạn biết bạn gặp phải lỗi cụ thể nào. Nếu không, chúng ta phải đoán xem bạn đã làm điều gì đó sai và những gì, hoặc cho dù những gì bạn muốn làm không được thực hiện trong trình biên dịch của bạn, hoặc đơn giản là không được hỗ trợ trong ngôn ngữ. (Điều này hữu ích nhất cùng với mã sinh sản tối thiểu.)

0

Để giải quyết sự cố và đặc biệt khi bạn muốn có const map chứa unique_ptr, bạn có thể sử dụng lambda. Đây không phải là danh sách khởi tạo , nhưng kết quả tương tự:

typedef std::map<uint32_t, std::unique_ptr<int>> MapType; 
auto const typeMap([]() 
{ 
    MapType m; 
    m.insert(MapType::value_type(0x0023, std::make_unique<int>(23))); 
    return m; 
}()); 
Các vấn đề liên quan