2010-05-05 20 views
9

Witam wszystkich Mam następujący w funkcji składowejmap operator [] argumenty

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

i następującą deklarację zmiennej członkiem

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

jednak pojawia się błąd przy kompilacji (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>                 ^

Wiem, że to musi być coś głupiego, ale nie widzę, co zrobiłem źle.

UPDATE Dzwonię to z const funkcji członka, który jest dlaczego typ zmiennej użytkownika jest const więc pomyślałem, że coś takiego jak poniżej powinien to naprawić:

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

ale bez kości .. nadal ten sam błąd.

+0

Odpowiedź z Potatoswatter jest poprawna. Aby uniknąć problemu, musisz użyć find. – fulmicoton

Odpowiedz

20

typy argumentów operacji są: const std :: map < int ...

map::operator[] nie działa z const map.

I answered to kilka dni temu.

mapa :: operator [] jest trochę dziwny. To robi to:

  1. Poszukaj klucza.
  2. Jeśli zostanie znaleziony, zwróć go.
  3. Jeśli nie, wstaw to i domyślnie - skonstruuj powiązaną wartość .
  4. Następnie zwróć referencję do nowej wartości.

Krok 3 jest niezgodny ze stałością. Zamiast dwóch przeciążających się różnych operatorów operator wymusza na użycie map :: find dla obiektów const.

+0

To dokładnie to !! Będę oznaczony jako odpowiedź w ciągu siedmiu minut, nie wiem, dlaczego nie mogę już ... jeśli odpowiedź jest prawidłowa, to jest właściwe :) –

+0

Prawdopodobnie warto wspomnieć o 'std :: map :: at' teraz. – juanchopanza

5

Prototyp dla [] jest

data_type& operator[](const key_type& k) 

tj non funkcjonowania const, więc nie można nazwać go na członka z const funkcji członka.

Można zmienić kod do:

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