2012-08-30 15 views
5

Ho ottenuto un ciclo in cui utilizzo una funzione che restituisce std :: unique_ptr a un oggetto di una classe astratta. Voglio memorizzare questi oggetti in un vettore std :: push_back. Ma dal momento che gli oggetti sono di tipo astratto ottengo il seguente errore:Come memorizzare un vettore di oggetti di una classe astratta che sono dati da std :: unique_ptr?

error: cannot allocate an object of abstract type 

per la linea

cells.push_back(std::move(*cell)); 

in cui le cellule è un std::vector di tipo astratto e cell è di tipo

std::unique_ptr<AbstractType>&& cell 

(In realtà passo cell a una classe di gestore) So che non è possibile creare un'istanza di tipo astratto e come capisco lo std: muovere l'operatore ha bisogno di istanziare l'oggetto in qualche modo?

Qualcuno può aiutarmi a gestire il problema? O la funzione (non la mia parte del progetto) non restituisce un puntatore univoco a un oggetto di tipo astratto?

+6

Stiamo parlando di un 'vector '? Quello non funzionerà. Memorizza invece un 'vector >'. –

+0

Hai ragione! Ero cieco, l'ho cambiato in 'vector >' e ora funziona – soriak

+0

@ R.MartinhoFernandes: +1 sul tuo commento (che dovrebbe essere una risposta). Devi leggere le menti! –

risposta

9

Non è possibile memorizzare gli elementi AbstractType direttamente su un std::vector. È possibile memorizzare semplicemente i unique_ptr s in un std::vector<std::unique_ptr<AbstractType>> con cells.push_back(std::move(cell)).

+0

Il motivo è che si sta invocando il costruttore di copie e si tenta quindi di creare un'istanza di una classe astratta. –

Problemi correlati