C++ const std::map reference nicht kompiliert werden
Gibt es einen Grund, warum der übergabe einer Referenz auf ein std::map
als const bewirkt, dass der [] - operator zu brechen? Ich bekomme diese compiler-Fehlermeldung (gcc 4.2) wenn ich mit const:
error: no match for 'operator[]' in
'map[name]'
Hier ist der Funktionsprototyp:
void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);
Und sollte ich erwähnen, dass es kein problem ist, wenn ich entfernen Sie die const
Schlüsselwort vor std::map
.
Wenn ich schon wies richtig, die [] - operator wird eigentlich legen Sie ein neues paar in die Karte, wenn es nicht den Schlüssel finden, das würde natürlich erklären, warum dies geschieht, aber ich kann mir nicht vorstellen, dass dies jemals ein akzeptables Verhalten.
Ob es eine bessere Methode, wie die Verwendung von finden anstelle von [], würde ich es begrüßen. Ich kann nicht scheinen, um Arbeit zu finden, entweder, obwohl... ich erhalte const nicht übereinstimmende iterator Fehler.
InformationsquelleAutor der Frage Joe Bane | 2009-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man ja nicht verwenden
operator[]
. Verwendenfind
aber beachten Sie, es gibtconst_iterator
stattiterator
:Es ist wie mit Zeigern. Sie können nicht zuweisen
int const*
zuint*
. Ebenso können Sie nicht zuordnenconst_iterator
zuiterator
.InformationsquelleAutor der Antwort Johannes Schaub - litb
Wenn Sie mit operator[], std::map sieht für das Element mit dem gegebenen Schlüssel. Wenn Sie nicht finden, er schafft es. Also das problem mit const.
Verwenden find-Methode und Sie werden in Ordnung sein.
Können Sie bitte post code, wie Sie versuchen, zu verwenden, finden() ?
Der richtige Weg wäre :
InformationsquelleAutor der Antwort Benoît
Wenn Sie C++11, std::map:: sollte für Sie arbeiten.
Den Grund std::map::operator[] nicht funktioniert, ist, dass Sie im Fall der Schlüssel, den Sie suchen, nicht vorhandene in der map, wird es fügen Sie ein neues element mit dem mitgelieferten Schlüssel und die Rückgabe einer Referenz auf sich (Siehe link für details). Dies ist nicht möglich auf ein const std::map.
Dem 'at' - Methode, jedoch wird eine exception werfen wenn die Schlüssel nicht vorhanden. That being said, ist es wahrscheinlich eine gute Idee, um für das Vorhandensein des Schlüssels mit der std::map::find-Methode, bevor Sie versuchen, Zugriff auf das element mit dem 'at' - Methode.
InformationsquelleAutor der Antwort Rohit Shrinath
Wahrscheinlich, weil es gibt keine const operator[] in std::map. operator[] fügen das element, das Sie suchen, wenn es nicht gefunden. Nutzen Sie also die find () - Methode, wenn Sie wollen, zu suchen, ohne die Möglichkeit des Hinzufügens.
InformationsquelleAutor der Antwort Fred Larson
Für Ihre "nicht übereinstimmende const iterator Fehler" :
find() hat zwei überladungen:
Meine denke ist, dass Sie diese Fehlermeldung bekommen, weil Sie etwas tun, wie die Zuordnung einer nicht-const-iterator (Links) auf das Ergebnis einer
find()
Anruf auf einerconst
anzeigen:Das würde zu einem Fehler führen, wenn auch vielleicht nicht die, die Sie sehen.
InformationsquelleAutor der Antwort Dan Breslau