carte opérateur [] opérandes
Question
Salut tout ce que je suit dans une fonction membre
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 de stupide, mais je ne peux pas voir ce que j'ai mal fait.
UPDATE J'appelle cela d'une fonction membre const qui est la raison pour laquelle le type de 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.
La solution
types opérandes sont: const std :: carte
map::operator[]
ne fonctionne pas avec un const map
.
répondu il y a quelques jours.
carte :: operator [] est un peu bizarre. Il fait ceci:
- Recherchez la clé.
- Si trouvé, retournez-le.
- Dans le cas contraire, l'insérer et par défaut, construire son associé valeur.
- Revenez ensuite une référence à la nouvelle valeur.
L'étape 3 est incompatible avec constness. Plutôt que d'avoir deux opérateur différent fonctionnement [] Surcharges, les forces linguistiques vous à carte d'utilisation :: trouver des objets const.
Autres conseils
Le prototype de []
est
data_type& operator[](const key_type& k)
i.e.. 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;
}