const iterator
-
Ich habe eine Frage zu diesem Code:
Object* Dev::getObject(const std::string& name) const { ObjectMap::const_iterator it = objs.find(name); return it != objs.end() ? it->second : NULL; }Da meckert mein Compiler:
error C2440: 'initializing' : cannot convert from 'std::_Tree<_Traits>::const_iterator' to 'std::_Tree<_Traits>::iterator'
Der Grund ist wohl, dass find() einen const_iterator liefert. Ich verstehe nur nicht warum. meine map objs ist eine ganz normale map und keine const map.
Ich dachte das läuft so in C++:Foo f; const Foo cf; f.bar(); // ruft Foo::bar() auf cf.bar(); // ruft Foo::bar() const aufAber wieso wird bei mir find() const aufgerufen, wenn map nicht konstant ist?

-
Wenn objs ein Member der Klasse Dev ist, ist es const, weil this const ist (und das ist es, weil Du const am Ende des Funktionskopfes von Dev::getObject notierst).
Die Fehlermeldung verstehe ich trotzdem nicht, da sowohl find() const als auch end() const einen const_iterator zurückliefern.
-
Die Fehlermeldung an sich find ich auch komisch, aber wenn man nen bissl was rauskürzt, sieht man sehr gut, was passiert:
Object* Dev::getObject(const std::string& name) const { ObjectMap::const_iterator it; return it->second; }const_iterator gibt nur ein
const Object*wieder...
schreib also einfach const Object* oder mach die fkt nicht const und schreib iterator...bb
-
Grundsätzlich richtig, aber sollte dann die Fehlermeldung nicht lauten "cannot convert from const Object* to Object*"?
-
LordJaxom schrieb:
Grundsätzlich richtig, aber sollte dann die Fehlermeldung nicht lauten "cannot convert from const Object* to Object*"?
hätte ich deshalb eben auch erwartet - und hab deshalb auch komische fehlermeldung geschrieben...
bb
-
Das heißt also, dass weil die Methode const ist, this vom Typ const T* const ist und ich somit NUR const Methoden über this aufrufen kann, richtig? Sprich:
this->bar() geht nur, wenn bar() const ist?Zu der Fehlermeldung: Ich hatte in meinem Code einen kleinen Fehler, denn statt ObjectMap::const_iterator stand da eigentlich ObjectMap::iterator.
-
audicupvorfreuer schrieb:
Das heißt also, dass weil die Methode const ist, this vom Typ const T* const ist und ich somit NUR const Methoden über this aufrufen kann, richtig? Sprich:
this->bar() geht nur, wenn bar() const ist?Jap. Genauergesagt ist this vom Typ Dev const* const und alle Member sind ebenfalls const (auf oberster Ebene). Sprich, Du kannst auch auf Member der Klasse nur const-Methoden aufrufen.
Zu der Fehlermeldung: Ich hatte in meinem Code einen kleinen Fehler, denn statt ObjectMap::const_iterator stand da eigentlich ObjectMap::iterator.
Dann ergibt die Meldung schlagartig Sinn.
-
LordJaxom schrieb:
Zu der Fehlermeldung: Ich hatte in meinem Code einen kleinen Fehler, denn statt ObjectMap::const_iterator stand da eigentlich ObjectMap::iterator.
Dann ergibt die Meldung schlagartig Sinn.
Richtig - wann lernen die Leute es eigtl endlich, mal den Code zu kopieren statt abzutippen und dabei noch 100 Fehler reinzumachen

bb