2010-05-05 24 views
9

Hola a todos tengo lo siguiente en una función miembromapa operador [] operandos

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest); 

y la siguiente declaración de una variable miembro

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode; 

Sin embargo, me sale un error al compilar (Intel Compilador 11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands 
1>   operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ] 
1>   vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                 ^

Sé que tiene que ser algo tonto pero no puedo ver lo que he hecho mal.

ACTUALIZACIÓN Voy a llamar a esto de un método constante por lo que el tipo de la variable miembro es const así que pensé que algo como lo siguiente debería solucionarlo:

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

Pero no dados .. . sigue siendo el mismo error.

+0

La respuesta de Potatoswatter es correcta. Para evitar su problema, debe usar find. – fulmicoton

Respuesta

20

tipos de operando son: const std :: mapa < int ...

map::operator[] no funciona con un const map.

I answered esto hace unos días.

mapa :: operador [] es un poco extraño. Es hace esto:

  1. Busque la clave.
  2. En caso de encontrar, devolverlo.
  3. De lo contrario, insértelo y construya por defecto su valor asociado .
  4. A continuación, devuelva una referencia al nuevo valor.

El paso 3 es incompatible con la constness. En lugar de tener dos operadoras de funcionamiento diferente [] sobrecargas, el lenguaje lo obliga a utilizar map :: find para objetos const.

+0

¡Eso es exactamente! Marcaré como contestado en siete minutos, no sé por qué no puedo ya ... si la respuesta es correcta, es correcto :) –

+0

Probablemente valga la pena mencionar 'std :: map :: at' now. – juanchopanza

5

El prototipo para [] es

data_type& operator[](const key_type& k) 

es decir, una operación no constante, por lo que no se puede llamar a un miembro de un método constante.

podría cambiar el código para:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt); 
if (egressCandidatesByDestAndOtMode.end() != where) { 
    const vector<set<int>>& temp = where->second; 
} 
Cuestiones relacionadas