A vector
a menudo necesita mover elementos alrededor.Cada vez que un vector necesita crecer cuando llama al push_back()
, reasigna la memoria para mantenerse contigua y copia todos los elementos existentes en el nuevo espacio. Además, si llama a insert()
o remove()
, los elementos deben cambiarse. Para que vector
pueda hacer todo lo que los elementos deben ser copiables, lo que significa que el tipo que almacena en el vector debe tener definido el operador de asignación.
Generalmente, si define una clase, el compilador generará el operador de asignación para esa clase. Sin embargo, hay casos en que el compilador no puede hacer eso. Uno de estos casos es cuando la clase tiene miembros constantes (tenga en cuenta que los punteros a const están bien).
Entonces, en su caso, el problema es el const string name
. Impide que el compilador genere operator=()
, lo que a su vez impide que se compile vector
, aunque usted no use realmente la asignación en sus elementos.
Una solución es hacer name
no const. El otro es escribir su propio Student::operator=()
, de alguna manera que tenga sentido. La tercera forma es, como ha señalado, utilizar un vector de punteros en lugar de un vector de objetos. Pero luego debe manejar su asignación y desasignación.
P.S. El otro caso cuando el compilador no puede generar operator=
es cuando su clase tiene miembros que son referencias.
Esto parece compilar y vincular con VC 2010. ¿Puede proporcionar más información sobre su entorno? ¿Es este un caso de prueba completo que reproduce esa falla de compilación? – DRH
@DRH: Estoy en VC 2008, lo siento. Y sí, ese es todo el caso de prueba. – Mehrdad
Mientras que para otras operaciones necesitaría el operador de asignación, no puedo pensar en ninguna posible razón por la cual 'push_back' tendría ese requisito ... de nuevo, es posible que la implementación verifique el requisito' Asignable'. –