Wrapper um std::map: Problem mit dem Einfügeoperator
-
Hallo,
ich will eine kleine Wrapper-Klasse um std::map schreiben die nur Einfügen, Wert holen und Wert löschen unterstützt. Ich habe dazu private von std::map abgeleitet.
template<class Key, class Value> class MapWrapper : private std::map<Key, Value> { public: void add(Key key, Value value) { *this[key] = value; // Fehler } // ... }; int main() { MapWrapper<int, int> m; m.add(5, 10); }
Leider bekomme mit diesem Code zwei Fehlermeldungen:
error C2100: Zeigeroperation ungültig
error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung möglich)Wie ruft man den operator[] richtig auf?
Bitte nicht über den Sinn dieser Klasse diskutieren?
:p
-
vielleicht so?
this->operator[](Key) = Value;
Kann ich jetzt aber nciht genau sagen
-
Warum erbst du von std::map?
Wäre es nicht besser std::map als Member zu haben?Denn std::map hat weder protected noch virtual Member - ich sehe also keinen Grund für Vererbung.
-
Danke Maxi, haut hin.
Auch ohne das this->.
@Shade: Die Klasse soll später HandleMap heissen. Wenn ich std::map als Member machen würde, wäre die Beziehung ja: HandleMap hat eine std::map.
Laut deinem Tutorial heißt private Vererbung "IST IMPLEMENTIERT MIT".
Und HandleMap ist implementiert mit std::map passt meiner Meinung irgendwie besser.
-
Ein Member bedeutet auch implementiert-mit.
Vererbung sorgt hier nur für Nachteile. Lass das lieber sein und besorg dir das Buch Effektiv-C++
-
Ich habe die genaue Implementation von std::map im Kopf, aber u.U. kann es sogar gefährlich sein zu erben wenn der Destruktor der Basisklasse nicht virtual ist!
-
MaSTaH schrieb:
Ich habe die genaue Implementation von std::map im Kopf, aber u.U. kann es sogar gefährlich sein zu erben wenn der Destruktor der Basisklasse nicht virtual ist!
natürlich ist der dtor von std::map nicht virtual
Aber das ist egal, da es hier um private vererbung geht.Nur um Meyers zu zitieren:
Item 40 in Effective C++ schrieb:
Modellieren Sie "hat ein" und "ist implementiert mit" durch Layering