2013-06-18 28 views
6

Ho questo codice per inizializzare la mappa da in a unique_ptr.Come inizializzare uniformemente la mappa di unique_ptr?

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

Posso utilizzare inizializzare uniforme questo? Ho provato

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

Ma ho ricevuto un errore.

Una parte di messaggio di errore è

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

Qual è stato l'errore? Il programma si è bloccato durante l'esecuzione? –

+0

possibile duplicato di [Perché non posso spingere \ _back un unico \ _ptr in un vettore?] (Http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique- PTR-in-un-vettore) –

risposta

7

unique_ptr è mobile, ma non copiabile. initializer_list richiede tipi di copia; non puoi spostare qualcosa da un initializer_list. Sfortunatamente, credo che ciò che vuoi fare non sia possibile.

Per inciso, sarebbe più utile sapere quale errore specifico si è ottenuto. Altrimenti, dobbiamo indovinare se hai fatto qualcosa di sbagliato e cosa, o se ciò che vuoi fare non è implementato nel tuo compilatore, o semplicemente non è supportato nella lingua. (Questo è molto utile insieme al codice riproduzione minimo.)

0

Come soluzione alternativa e soprattutto quando si desidera avere un const map contenente unique_ptr, è possibile utilizzare un lambda giustiziati sul posto. Non si tratta di un elenco di inizializzazione , ma il risultato è simile:

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; 
}()); 
Problemi correlati