2012-08-30 18 views
5

Obtuve un bucle en el que uso una función que devuelve std :: unique_ptr a un objeto de una clase abstracta. Quiero almacenar estos objetos en un estándar :: vector a través de push_back. Pero ya que los objetos son de tipo abstracto me sale el siguiente error:¿Cómo almacenar un vector de objetos de una clase abstracta que están dados por std :: unique_ptr?

error: cannot allocate an object of abstract type 

para la línea

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

donde las células es un std::vector del tipo abstracto y cell es de tipo

std::unique_ptr<AbstractType>&& cell 

(De hecho paso cell a una clase de controlador) Sé que no se puede crear una instancia de un tipo abstracto y como yo Estoy entendiendo que el operador estándar: mover necesita instanciar el objeto de alguna manera?

¿Alguien me puede ayudar a solucionar el problema? ¿O debería la función (no mi parte del proyecto) devolver un puntero único a un objeto de tipo abstracto?

+6

¿Estamos hablando de un 'vector '? Eso no funcionará Almacene un 'vector >' en su lugar. –

+0

¡Tienes razón! Estaba ciego, lo cambié a 'vector >' y ahora funciona – soriak

+0

@ R.MartinhoFernandes: +1 en tu comentario (esa debería ser una respuesta). ¡Debes leer las mentes! –

Respuesta

9

No puede almacenar AbstractType elementos directamente en un std::vector. Simplemente puede almacenar los unique_ptr s en un std::vector<std::unique_ptr<AbstractType>> con cells.push_back(std::move(cell)).

+0

El motivo es que está invocando el constructor de copia y, por lo tanto, intenta crear una instancia de una clase abstracta. –

Cuestiones relacionadas