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

War es hilfreich?

Lösung

std::map der operator [] nicht als const erklärt, und kann nicht auf ihr Verhalten zurückzuführen sein:

  

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top