2015-04-27 30 views
15

Per favore qualcuno può spiegare perché il seguente codice non viene compilato usando clang 3.5.Errore di compilazione associato al vettore di const std :: string

L'errore riportato è "No sovraccarico" = "nell'algoritmo".

std::vector<const std::string> m_messages; 
std::vector<const std::string>::iterator iter; 
... 

if (iter != m_messages.end()) 
{ 
    m_messages.erase(iter);  // compilation error 
} 

Se io dichiaro m_messages come: std::vector<std::string> m_messages; allora compila OK.

Inoltre, qual è la differenza tra:

std::vector<const std::string> m_messages; 

e

std::vector<std::string> m_messages; 

TIA.

risposta

16

Per cancellare un elemento, gli elementi del lato destro devono essere spostati (spostati a sinistra).

Poiché le stringhe sono const, l'elemento precedente non può essere sovrascritto (tramite l'operatore =), quindi l'errore.

+0

Vuol dire che non ha senso avere un vettore di const stringhe se gli elementi possono essere rimossi? – ksl

+0

Non sono abbastanza sicuro di essere abbastanza esperto per confermare questo, ma con il modo in cui il vettore è implementato, sembra così .. ma ha certamente senso avere un contenitore che supporti questo (ad esempio tramite distruttore + costruttore di copie). forse c'è qualcosa nella libreria boost? –

+0

OK, grazie. Forse farò una domanda separata relativa a ciò in particolare se non avrò una risposta qui. – ksl

5

Significa che non ha senso avere un vettore di stringhe cost se gli elementi possono essere rimossi? Yes at least what the standard says

23.3.7.5 modificatori vettore [vector.modifiers]

iterator erase (posizione const_iterator); iteratore cancella (const_iterator prima, const_iterator ultimo);

Effetti: Invalida iteratori e riferimenti ao dopo il punto della cancellazione.

Complessità: Il distruttore di T è chiamato il numero di volte pari al numero degli elementi cancellati, ma l'operatore di assegnazione giocata T è chiamato il numero di volte pari al numero di elementi nel vettore dopo gli elementi cancellati.

Lanci: Niente meno che non viene generata un'eccezione da parte del costruttore di copia, spostare il costruttore, operatore di assegnazione, o spostare operatore di assegnazione di T.