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 auf
    

    Aber 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


Anmelden zum Antworten