2011-05-03 12 views
7
map<string,Shopable*>::iterator it = mymap.begin(); 

L'iteratore sembra essere costante, ma items.begin() non restituisce un iteratore costante. O, questo è quello che penso perché l'errore passaggio del mouse è qualcosa di simile:Constant mappa iteratore non sarà impostato mymap.begin()

"No conversion from 'std::Tree_const_iterator<...> to std::Tree_iterator<...> exists'". 

Perché?

risposta

15

Uso const_iterator come:

map<string,Shopable*>::const_iterator it = mymap.begin(); 

Da l'errore, il suo chiaro che mymap.begin() rendimenti const_iterator. Questo perché mymap è const nella funzione in cui hai scritto questo, qualcosa come segue:

void f(const std::map<int,int> & m) 
{ //^^^^^ note this 

     std::map<int,int>::const_iterator it = m.begin(); //m is const in f() 
         //^^^^^ note this 
} 

void g(std::map<int,int> & m) 
{ 
     std::map<int,int>::iterator it = m.begin(); //m is non-const in g() 
} 

Cioè, const contenitore (se la sua std::map, std::vector ecc) restituisce const_iterator e contenitore non-const rendimenti iterator.

Ogni contenitore ha funzioni sovraccariche di begin() e end(). Quindi il contenitore const richiama l'overloading begin() che restituisce const_iterator e il contenitore non const invoca l'altro sovraccarico begin() che restituisce iterator. E lo stesso vale per le funzioni sovraccaricate di end().

+0

Perché restituire un 'const_iterator '? Tutti gli esempi che ho visto ritornano semplicemente "iteratore". – pighead10

+0

std :: map.begin() ha anche un overload che restituisce un 'iteratore'. Vedere http://www.cplusplus.com/reference/stl/map/begin/ –

+0

@Pig Head: ho fornito una risposta, ma fondamentalmente ci sono due overload, uno dei quali è una funzione const member, l'altro è un funzione membro non const. Quindi si chiama 'begin()' su un oggetto non-const, si prenderà la versione non-const e si restituirà un 'iterator', quando si chiama' begin() 'su una mappa const verrà acquisita la versione const e restituire un 'const_iterator'. –

4

Il problema è che mymap nel codice sopra è una mappa costante, non una mappa mutabile (forse è un membro di una classe e che il codice è all'interno della funzione membro costante?). Quindi la chiamata a mymap.begin() eseguirà il sovraccarico che restituisce un const_iterator invece del sovraccarico che restituisce un iterator.

Se non è necessario cambiare il contenitore tramite l'iteratore, utilizzare const_iterator. Se intendi modificare la mappa, assicurati di utilizzare un oggetto non const per il ciclo (forse la funzione membro (se questo è il caso) non dovrebbe essere const?)

Problemi correlati