C ++ Karte Zugang verwirft Qualifier (const)
Frage
Der folgende Code besagt, dass die Karte als const
in die operator[]
Methode übergeben verwirft Qualifier:
#include <iostream>
#include <map>
#include <string>
using namespace std;
class MapWrapper {
public:
const int &get_value(const int &key) const {
return _map[key];
}
private:
map<int, int> _map;
};
int main() {
MapWrapper mw;
cout << mw.get_value(42) << endl;
return 0;
}
Ist dies wegen der möglichen Zuordnung, die auf der Karte Zugriff auftritt? Kann Zugriffe keine Funktionen mit Karte erklärt const werden?
MapWrapper.cpp:10: error: passing ‘const std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >’ as ‘this’ argument of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >]’ discards qualifiers
Lösung
T & operator [] (const Key & key)
Gibt einen Verweis auf den Wert, der mit einem Schlüssel entspricht Schlüssel zugeordnet wird, Einfügung durchführt, wenn diese Taste nicht bereits vorhanden ist.
Als Ergebnis Ihre Funktion kann nicht const
deklariert werden, und die Karte des operator[]
verwenden.
std::map
der find()
Funktion ermöglicht es Ihnen, einen Schlüssel zum Nachschlagen ohne Änderung die Karte.
find()
gibt einen iterator
oder const_iterator
auf ein std::pair
sowohl den Schlüssel (.first
) und den Wert (.second
) enthält.
In C ++ 11, können Sie auch at()
std::map
. Wenn das Element die Funktion nicht existiert eine std::out_of_range
Ausnahme auslöst, im Gegensatz zu operator []
.
Andere Tipps
Sie können nicht operator[]
auf einer Karte verwenden, die als diese Methode const
ist nicht const
, wie es Ihnen die Karte ändern kann (Sie können _map[key]
zuweisen). Versuchen Sie, die find
Methode statt.
Da operator[]
keine const qualifizierte Überlastung, kann es nicht sein sicher in einer const qualifizierten Funktion verwendet. Dies ist wahrscheinlich, weil die Stromüberlastung mit dem Ziel, sowohl der Rückkehr und Einstellung Schlüsselwerten gebaut wurde.
Sie können stattdessen verwenden:
VALUE = map.find(KEY)->second;
oder, in C ++ 11, können Sie verwenden, um die at()
Betreiber:
VALUE = map.at(KEY);
Einige neuere Versionen der GCC-Header (4.1 und 4.2 auf meinem Rechner) haben Nicht-Standard-Karte Mitgliederfunktionen :: at (), die const deklariert sind und werfen std :: out_of_range, wenn der Schlüssel nicht in der Karte.
const mapped_type& at(const key_type& __k) const
Von einer Referenz in der Bemerkung der Funktion, es scheint, dass dies als eine neue Member-Funktion in der Standardbibliothek vorgeschlagen wurde.
Als erstes sollten Sie keine Symbole verwenden beginnend mit _, weil sie auf die Sprachimplementierung / Compiler Schriftsteller reserviert sind. Es wäre sehr einfach für _map auf jemandes Compiler einen Syntaxfehler zu sein, und Sie würden niemanden haben, verantwortlich zu machen, sondern sich selbst.
Wenn Sie einen Unterstrich verwenden möchten, setzen Sie es am Ende, nicht am Anfang. Sie hat wahrscheinlich diesen Fehler, weil Sie einige Microsoft-Code tut es sah. Denken Sie daran, sie schreiben ihre eigenen Compiler, so sie in der Lage sein kann, mit ihm wegzukommen. Trotzdem, es ist eine schlechte Idee.
der Operator [] nicht nur eine Referenz, es tatsächlich schafft den Eintrag in der Karte. So können Sie nicht nur eine Zuordnung erhalten, wenn es keine gibt, ein erstellen Sie. Das ist nicht das, was Sie bestimmt.