Visual-Studio 2010 RC 1: skurriler Fehler mit type qualifier (const?!)



  • Hallo Leute,

    ich teste seit einigen Tagen das neue Visual-Studio und bin jetzt beim Übersetzen eines bestehenden Projektes mit einem Fehler konfrontiert worden, den ich nicht verstehe:

    Es gibt da eine Klasse CListener , in der eine Member vom Typ TConnectedApplicationSet enthalten ist; dabei handelt es sich um einen Alias für einen Container vom Typ std::set :

    typedef std::set<CConnectedApplication> TConnectedApplicationSet;
    
    class CListener : public CMapAppCommServerSocket
    {
        // ...several operations and members here...
        bool updateConnection(int connectionId, int state, const std::strin& name);
    
        TConnectedApplicationSet connectedApps;
    };
    

    Wie man sieht, ist in der Klasse auch eine Methode updateConnection enthalten, die nicht als const deklariert ist!

    Im body dieser Methode wird mittels set::find ein iterator auf das Set geholt (kein const_iterator!), dereferenziert, und dann wird auf dem Objekt in der Menge die Methode CConnectedApplication::setState aufgerufen, also in etwa so:

    TConnectedApplicationSet::iterator pos = connectedApps.find(app);
        // ...some checks here...
        pos->setState(...);
    

    CConnectedApplication::setState ist - was für setter eigentlich obligatorisch ist - auch nicht const!

    Mit Visual-Studio 2005 war noch alles OK, mit VS 2010 wird nun die Variable pos markiert und mit folgender Fehlermeldung dekoriert:

    Error: the object has type qualifiers thet are not compatible with the member function

    😕

    Ich versteh's nicht! Hat vielleicht jemand einen Tipp? Danke!

    Gruß
    Stephan



  • compilierbares minimalbeispiel machen.


  • Mod

    Das Verändern eines sets widerspricht dem Standard.
    Die Gefahr, das Du über den iterator den set manipulierst auf eine nicht erlaubte Weise ist groß.
    In der VC-2010 wurde dies nun strikt durchgesetzt. Die iteratoren geben Dir nur noch eine const Referenz. Auch wenn es kein const_iterator ist!

    Korreterweise müsstest Du aus dem set eine map machen, mit getrennten unveränderlichen key und dem änderbaren Datenteil.

    Du kannst zu einem Hack greifen und const wegcasten. (BÖSE!)

    PS: Ich vermute, dass Du nur Daten änderst, die keinen Einfluss auf die Reihenfolge haben. Nun stellt sich dennoch die Frage, warum nimmst Du keine map...



  • Guten Morgen,

    erst einmal Danke für die Antworten!

    Martin Richter schrieb:

    Das verändern eines sets widerspricht dem Standard.

    Aha...gut! Das erklärt alles!

    Martin Richter schrieb:

    PS: Ich vermute, dass Du nur Daten änderst, die keinen Einfluss auf die Reihenfolge haben.

    Richtig.

    Martin Richter schrieb:

    Nun stellt sich dennoch die Frage, warum nimmst Du keine map...

    Das werde ich nun auch tun. Da das Projekt aber nicht von mir, und noch nicht einmal von unserem Unternehmen, stammt, sondern extern entwickelt wurde, wollte ich erst einmal auf Nummer sicher gehen. Vielen Dank nochmal!

    Gruß
    Stephan


Log in to reply