Frage

Hallo zusammen ich folgend in einer Elementfunktion habe

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

und die folgende Deklaration einer Elementvariable

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

Jedoch habe ich einen Fehler beim Kompilieren (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>                                                                    ^

Ich weiß, es hat etwas dumm zu sein, aber ich kann nicht sehen, was ich falsch gemacht habe.

UPDATE Ich rufe dies aus einer const Member-Funktion, weshalb die Membervariable des Typ const ist so dachte ich, dass so etwas wie die folgenden Fehler beheben soll:

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

Aber keine Würfel ... immer noch die gleichen Fehler.

War es hilfreich?

Lösung

Operandentypen sind: const std :: map

map::operator[] funktioniert nicht mit einem const map.

I dies vor ein paar Tagen beantwortet.

Karte :: operator [] ist ein wenig seltsam. Es tut dies:

  1. Geben Sie für den Schlüssel.
  2. Wenn Sie gefunden werden, es zurück.
  3. Falls nicht, legen Sie sie und default-Konstrukt seiner zugehörigen Wert.
  4. Kehren Sie dann einen Verweis auf den neuen Wert.

Schritt 3 ist nicht kompatibel mit Konstantheit. Anstatt zwei haben anders funktionierenden Operator [] Überlastungen, die Sprache zwingt Sie zu Nutzungskarte :: finden für const-Objekte.

Andere Tipps

Der Prototyp für [] ist

 data_type& operator[](const key_type& k)

d. ein nicht const Betrieb, so dass Sie es auf einem Mitglied aus einer const Member-Funktion nicht aufrufen können.

Sie können den Code ändern zu:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top