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

El iterador parece ser constante, pero items.begin() no devuelve un iterador constante. O eso es lo que yo creo porque el error al pasar el ratón es algo así como:mapa iterador constante no va a fijar a mymap.begin()

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

¿Por qué?

Respuesta

15

Uso const_iterator como:

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

Desde el error, claro que sus retornos mymap.begin()const_iterator. Esto es así porque es mymapconst en la función donde se ha escrito esto, algo así como lo siguiente:

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() 
} 

que es, const contenedor (si su std::map, std::vector etc) devuelve const_iterator y contenedores no constante vuelve iterator.

Cada contenedor tiene funciones sobrecargadas de begin() y end(). Entonces, el contenedor const invoca el begin() sobrecargado que devuelve const_iterator y el contenedor no constante invoca el otro sobrecargado begin() que devuelve iterator. Y lo mismo para las funciones sobrecargadas end().

+0

¿Por qué devolvería un 'const_iterator ¿? Todos los ejemplos que he visto devuelven 'iterator'. – pighead10

+0

std :: map.begin() también tiene una sobrecarga que devuelve un 'iterador'. Ver http://www.cplusplus.com/reference/stl/map/begin/ –

+0

@Pig Head: He proporcionado una respuesta, pero básicamente hay dos sobrecargas, una de las cuales es una función de miembro constante, la otra es una función de miembro no const. Entonces llamas 'begin()' en un objeto no const, recogerá la versión non-const y devolverá un 'iterator', cuando invoques' begin() 'en un mapa const recogerá la versión const y devuelve un 'const_iterator'. –

4

El problema es que mymap en el código anterior es un mapa constante, no un mapa mutable (¿quizás es un miembro de una clase y ese código está dentro de la función de miembro constante?). Por lo tanto, la llamada al mymap.begin() activará la sobrecarga que devuelve un const_iterator en lugar de la sobrecarga que devuelve un iterator.

Si no necesita cambiar el contenedor a través del iterador, use const_iterator. Si tiene la intención de modificar el mapa, asegúrese de que está utilizando un objeto no const para el bucle (tal vez la función miembro (si ese es el caso) no debería ser const?)

Cuestiones relacionadas