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 qualifiersUm 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 qualifiersNun 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?)
-
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.