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


Anmelden zum Antworten