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)
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. –
Welchen Fehler bekommen Sie mit der const-Deklaration? –
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]; ' –