Pregunta

¿Hay una razón por la que pasa una referencia a un std::map como const hace que el operador [] para romper? Me sale este error del compilador (gcc 4.2) cuando se utiliza const:

  

error: no puede competir con ‘operador []’ en   ‘Mapa [nombre]’

Esto es el prototipo de función:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

Y, debo mencionar que no hay ningún problema cuando quito la palabra clave const frente a std::map.

Si he recibido instrucciones correctamente, el operador [] realmente insertar un nuevo par en el mapa si no encuentra la llave, lo que explicaría por supuesto por qué sucede esto, pero no puedo imaginar que este nunca sería un comportamiento aceptable.

Si hay un método mejor, como el uso de find en lugar de [], se lo agradecería. Me parece que no puede conseguir encontrar a funcionar bien, aunque ... Voy a recibir const iterador errores no coincidentes.

¿Fue útil?

Solución

Si no se puede utilizar operator[]. Utilice find, pero tenga en cuenta que vuelve const_iterator en lugar de iterator:

std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

Es como con los punteros. No se puede asignar a int const* int*. Del mismo modo, no se puede asignar a const_iterator iterator.

Otros consejos

Cuando se está usando el operador [], std :: mapa se ve para el elemento con la clave dada. Si no encuentra ninguna, se crea. Por lo tanto el problema con const.

Uso encontrar método y se le multa.

Puede usted por favor, puesto código en la forma en que está tratando de utilizar find ()? La forma correcta sería:

if( map.find(name) != map.end() )
{
   //...
}

Si estás usando C ++ 11, std :: Mapa :: en debe trabajar para usted.

std :: Mapa :: operador [] que no funciona es que en el caso de la tecla que está buscando no existe en el mapa, se insertará un nuevo elemento con la llave suministrada y devuelva una referencia a él (ver el enlace para más detalles). Esto no es posible en un const std :: mapa.

El 'al' método, sin embargo, será una excepción si no existe la clave. Dicho esto, es probablemente una buena idea para comprobar la existencia de la clave utilizando la std :: Mapa :: encontrar el método antes de intentar acceder al elemento utilizando el método de 'at'.

Probablemente porque no hay ningún operador const [] en std :: mapa. operador [] añadirá el elemento que estás buscando si no lo encuentra. Por lo tanto, utilice el método find () si desea buscar sin la posibilidad de añadir.

Para sus "errores de iterador no coincidentes const":

find () tiene dos sobrecargas:

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

Mi conjetura es que usted está recibiendo este error porque estás haciendo algo así como la asignación de un iterador no constante (a la izquierda) con el resultado de una llamada find() en un mapa const:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

Eso se traduciría en un error, aunque quizás no el que usted está viendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top