A vector
A spesso è necessario spostare gli elementi.Ogni volta che un vettore deve crescere quando si chiama push_back()
, rialloca la memoria per mantenersi contigua e copia tutti gli elementi esistenti nel nuovo spazio. Inoltre, se si chiama insert()
o remove()
gli elementi devono essere spostati . Per vector
essere in grado di fare tutto ciò che gli elementi devono essere assegnabili alla copia, il che significa che il tipo che si memorizza nel vettore deve avere l'operatore di assegnazione definito.
In genere, se si definisce una classe, il compilatore genererà l'operatore di assegnazione per tale classe. Tuttavia, ci sono casi in cui il compilatore non è in grado di farlo. Uno di questi casi è quando la classe ha membri costanti (nota che i puntatori a const sono ok).
Quindi, nel tuo caso, il problema è il const string name
. Impedisce al compilatore di generare operator=()
, che a sua volta impedisce la compilazione di vector
, anche se in realtà non si utilizza l'assegnazione sui suoi elementi.
Una soluzione è rendere name
non-const. L'altro è quello di scrivere il proprio Student::operator=()
, in qualche modo che abbia senso. Il terzo modo è, come hai sottolineato, di usare un vettore di puntatori piuttosto che un vettore di oggetti. Ma poi devi gestire la loro allocazione e de-assegnazione.
P.S. L'altro caso in cui il compilatore non può generare operator=
è quando la classe ha membri che sono riferimenti.
Questo sembra compilare e collegare con VC 2010. Puoi fornire ulteriori informazioni sul tuo ambiente? È un caso di test completo che riproduce questo errore di compilazione? – DRH
@DRH: I'm on VC 2008, mi dispiace. E sì, questo è l'intero test case. – Mehrdad
Mentre per altre operazioni è necessario l'operatore di assegnazione, non riesco a pensare a nessun possibile motivo per cui 'push_back' avrebbe quel requisito ... quindi, di nuovo, potrebbe essere che l'implementazione controlli il requisito' Assegnabile'. –