Indexoperator für konstante Map



  • Hallo,

    ich habe eine Klasse, welche als Member eine zwei maps enthält. Für std::string habe ich diese nun spezialisiert:
    [cpp]
    template<>
    class Measurestd::string
    {
    typedef std::map<Primitive,Scalar::BigInteger>::const_iterator citer;
    protected:
    std::map<Primitive,Scalar::BigInteger> factors;
    std::map<Primitive,std::string> name;
    public:
    static std::map<Primitive,std::string> createNames //...

    // Konstruktoren...
    // Operationen...

    std::string toString() const
    {
    std::string value = "[";
    for (citer i=factors.begin();i!=factors.end();i++)
    {
    if (i->second != 0)
    {
    value += " ";
    value += std::stream_caststd::string(name[i->first]); // Problemstelle
    if (i->second != 1)
    {
    value += "^";
    value += std::stream_caststd::string(i->second);
    }
    }
    }
    return (value += " ]");
    }
    };[/cpp]

    Zum Verständnis: Die Klasse stellt eine physikalische Einheit dar (z. B. Nm oder VA). Primitive ist ein enum, der alle SI-Einheiten enthält (METER, CANDELA etc.). Solche Einheiten bestehen immer aus einem Produkt von Potenzen von SI-Einheiten und einem Bruch und ggf. einer Zehnerpotenz. (Beispiel: N := 10^3 * g * m * s^-2) Um nun beim Ausgeben einen String zuordnen zu können, brauche ich natürlich noch eine map, die mir die Strings liefert.

    Problemstelle: der Zugriff name[i->first]. Bei name handelt es sich ja (wegen const-Member) um eine konstante Map. Und map<T1,T2>::operator [](T1 index) scheint nicht const zu sein, so dass der Compiler nörgelt:

    "measure.hpp": datatypes/measure.hpp passing `const std::map<GeoMath::Measure::Primitive,std::string, std::less<GeoMath::Measure::Primitive>,
    std::allocator<std::pair<const GeoMath::Measure::Primitive, std::string> > >
    ' as `this' argument of `_Tp& std::map<_Key, _Tp, _Compare,
    _Alloc>::operator[](const _Key&) [with _Key = GeoMath::Measure::Primitive,
    _Tp = std::string, _Compare = std::less<GeoMath::Measure::Primitive>, _Alloc
    = std::allocator<std::pair<const GeoMath::Measure::Primitive, std::string>
    >]' discards qualifiers
    

    Um das ganze mal zu verschlanken:

    "measure.hpp": datatypes/measure.hpp passing `const std::map<GeoMath::Measure::Primitive,std::string>' as `this' argument of `_Tp& std::map<_Key, _Tp>::operator[](const _Key&)' discards qualifiers
    

    Nun die Frage: wie kann ich (const) auf ein Map-Member zugreifen?

    (PS: Warum wird in der Vorschau eigentlich das BB-Tag Code, aber nicht C++ formatiert?)


  • Mod

    zral schrieb:

    Problemstelle: der Zugriff name[i->first]. Bei name handelt es sich ja (wegen const-Member) um eine konstante Map. Und map<T1,T2>::operator [](T1 index) scheint nicht const zu sein, so dass der Compiler nörgelt:

    richtig, denn der operator verändert die map ja potentiell: wenn ein element noch nicht existiert, wird es eingefügt (mit default-konstruiertem value)

    Nun die Frage: wie kann ich (const) auf ein Map-Member zugreifen?

    benutz find. sinnvoller wäre hier aber wohl, nur eine map zu benutzen z.b.

    std::map<Primitive,std::pair<Scalar::BigInteger,std::string> >
    

    evtl. auch interessant: Suggestion for new member functions in standard containers



  • Dann kann ich ja aber eigentlich auch gleich einen vector nehmen. Es sind ja eigentlich immer max. soviele Elemente, wie es SI-Einheiten gibt. Und einen Vektor kann ich schließlich auch mit einem enum indizieren (vorher natürlich in einen int casten) - so müsste das funktionieren.


Anmelden zum Antworten