mappare operatore [] operandi
Domanda
Ciao a tutti ho il seguente in una funzione membro
int tt = 6;
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt];
set<int>& egressCandidateStops = temp.at(dest);
e la seguente dichiarazione di una variabile membro
map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;
Comunque ho un errore durante la compilazione (Intel Compiler 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> ^
Lo so è avuto modo di essere qualcosa di sciocco, ma non riesco a vedere quello che ho fatto di sbagliato.
Aggiorna sto chiamando questo da una funzione membro const, che è il motivo per cui il tipo di variabile membro è const così ho pensato che qualcosa di simile alla seguente dovrebbe risolvere il problema:
int dest = 0, tt = 6;
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest);
Ma no dadi ... ancora lo stesso errore.
Soluzione
operandi tipi sono: const std :: map
map::operator[]
non funziona con un const map
.
I risposto questo pochi giorni fa.
mappa :: operator [] è un po 'strano. esso fa questo:
- cercare la chiave.
- Se trovato, restituirlo.
- In caso contrario, inserirlo e default-costruire la sua associata valore.
- Quindi restituisce un riferimento al nuovo valore.
Fase 3 è compatibile con costanza. Piuttosto che avere due operatore diversamente funzionante [] sovraccarichi, la lingua che le forze per uso mappa :: trovare per gli oggetti const.
Altri suggerimenti
Il prototipo per []
è
data_type& operator[](const key_type& k)
vale a dire. un'operazione non const, quindi non si può chiamare su un membro di una funzione membro const.
Si potrebbe modificare il codice a:
std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
const vector<set<int>>& temp = where->second;
}