2017-06-01 2 views
2

Ich habe eine komplexe map, die am Ende Zeiger auf Drawable Objekte speichert. Drawable Objekte haben eine draw() Mitgliedsfunktion, die als const deklariert wird. Ich muss alle die draw Funktionen für alle Objekte in meiner Karte gespeichert, die von einem bestimmten Typ sind, und ich muss es innerhalb einer const Funktion tun. Jedoch kann ich nicht in der Lage sein, die const-Korrektheit meiner Funktion zu bewahren (drawSolid).Wie Konst-Korrektheit in multidimensionaler Karte in C++ zu erreichen

Meine äußere Karte (map<int, ##>) indexiert im Wesentlichen einige Teilkarten. Sub-Maps sind wiederum Indexierungsvektoren (map<ItemType, vector<##> >). Schließlich hält dieser Vektor eine Menge von shared_ptr<Drawable> Objekten.

Wenn ich die const Qualifier aus meinem Funktionskopf zu entfernen, alles kompiliert, aber ich brauche es const zu sein. Wie kann ich meine multidimensionale Karte durchlaufen, um die Korrektheit zu erhalten? Diese

void DrawableItems::drawSolid(int item_list = -1) const 
{ 
    typedef std::map<int, std::map<ItemType, std::vector<std::shared_ptr<Drawable> > > > drawablemap; 
    std::vector<std::shared_ptr<Drawable> > its; 
    for(drawablemap::const_iterator li = __items.begin(); li != __items.end(); li++) { 
     its = li->second[SOLID]; 
     for(auto di = its.begin(); di != its.end(); di++) { 
      di->get()->draw(); 
     } 
    } 
} 

die Fehler, die ich aus dem Compiler erhalten (G ++):

/.../dss-sim/src/graphics/DrawableItems.cpp: In member function ‘void DrawableItems::drawSolid(int) const’: 
/.../dss-sim/src/graphics/DrawableItems.cpp:51:35: error: passing ‘const std::map<DrawableItems::ItemType, std::vector<std::shared_ptr<Drawable> > >’ as ‘this’ argument discards qualifiers [-fpermissive] 
      its = li->second[SOLID]; 
           ^
In file included from /usr/include/c++/5/map:61:0, 
       from /.../dss-sim/src/common/dss.hpp:11, 
       from /.../dss-sim/src/graphics/DrawableItems.hpp:19, 
       from /.../dss-sim/src/graphics/DrawableItems.cpp:15: 
/usr/include/c++/5/bits/stl_map.h:494:7: note: in call to ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = DrawableItems::ItemType; _Tp = std::vector<std::shared_ptr<Drawable> >; _Compare = std::less<DrawableItems::ItemType>; _Alloc = std::allocator<std::pair<const DrawableItems::ItemType, std::vector<std::shared_ptr<Drawable> > > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::vector<std::shared_ptr<Drawable> >; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = DrawableItems::ItemType]’ 
     operator[](key_type&& __k) 
+1

Nicht auf Ihre Frage und Problem, aber machen Sie nicht Ihre eigenen Symbole mit zwei führenden Unterstriche, solche sind in allen Bereichen für die "Implementierung" (Compiler und Standard-Bibliothek) reserviert. Siehe [diese alte Frage und ihre Antworten] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-identifier) ​​für weitere Informationen. –

+0

Welchen Fehler bekommen Sie mit der const-Deklaration? –

+0

Ich werde die Frage jetzt aktualisieren, aber das ist, was ich bekomme: '/home/carles/Development/dss-sim/src/graphics/DrawableItems.cpp:51:35: Fehler: Übergabe 'const std :: map < DrawableItems :: ItemType, std :: vector >> 'als' dieses 'Argument verwirft Qualifier [-fpermissive] its = li-> Sekunde [SOLID]; ' –

Antwort

2

Es gibt keine const-Version operator[] in std::map. Allerdings gibt es eine const-Version von at(), die Sie stattdessen verwenden können:

its = li->second.at(SOLID); 

Der Grund dafür ist, dass operator[] ein Element einfügt, wenn kein Element noch ist, so kann es keine const Version von operator[] sein.
at() auf der anderen Seite löst eine Ausnahme aus, wenn kein Element existiert, und dies ist kompatibel mit einem const std::map.

+0

Das war es, vielen Dank! –