2010-05-05 3 views
9

Salut à tous je suit dans une fonction membreopérateur carte [] opérandes

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

et la déclaration suivante d'une variable membre

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

Cependant, je reçois une erreur lors de la compilation (compilateur 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>                 ^

Je sais que ça doit être quelque chose d'idiot mais je ne vois pas ce que j'ai fait de mal.

MISE À JOUR J'appelle cela d'une fonction membre const qui est la raison pour laquelle le type de la variable membre est const donc je pensais que quelque chose comme ce qui suit devrait fixer:

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

Mais pas de dés .. Toujours la même erreur

+0

La réponse de Potatoswatter est correcte. Pour éviter votre problème, vous devez utiliser find. – fulmicoton

Répondre

20

types d'opérandes sont: const std :: carte < int ...

map::operator[] ne fonctionne pas avec un const map.

I answered il y a quelques jours.

carte :: opérateur [] est un peu étrange. Il fait ceci:

  1. Recherchez la clé.
  2. Si trouvé, renvoyez-le.
  3. Sinon, insérez-le et construisez par défaut sa valeur associée.
  4. Renvoyez ensuite une référence à la nouvelle valeur.

L'étape 3 est incompatible avec la constance. Plutôt que d'avoir deux surcharges d'opérateur fonctionnant différemment [] , la langue vous force à d'utiliser map :: find pour les objets const.

+0

C'est exactement ça !! Je vais marquer comme répondu en sept minutes, je ne sais pas pourquoi je ne peux pas déjà ... si la réponse est correcte, c'est vrai :) –

+0

Il vaut probablement la peine de mentionner 'std :: map :: at' maintenant. – juanchopanza

5

Le prototype de [] est

data_type& operator[](const key_type& k) 

à savoir une opération non const, de sorte que vous ne pouvez pas l'appeler sur un membre d'une fonction membre const.

Vous pouvez changer le code:

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