Pregunta

Hola a todos Tengo el siguiente en una función miembro

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 (Compilador Intel 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.

Actualizar 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.

¿Fue útil?

Solución

operando tipos son: const std :: map

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

respondido hace esto a los pocos días.

Mapa :: operador [] es un poco extraño. Eso hace esto:

  1. buscar la llave.
  2. Si lo encuentra, devuelve.
  3. Si no, insertar y default-construir su asociado valor.
  4. A continuación, devuelve una referencia al nuevo valor.

Paso 3 es incompatible con constness. En lugar de tener dos operador diferente que funcione [] sobrecargas, el idioma que obliga a Mapa de Uso :: encontrar los objetos const.

Otros consejos

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.

Se 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top