6.0 -> .net 2003



  • Hi,

    folgende Fragen zu Visual Studio .net 2003:

    - Hier krieg ich eine Warnung:

    String String::operator +(const String &String) const
    {
        return *this + static_cast<std::string>(String);
    }
    

    warning C4717: 'AGE::String::operator+': Rekursiv für alle Steuerelementpfade. Die Funktion verursacht einen Stapelüberlauf zur Laufzeit.

    Dabei ist String von std::string abgeleitet und implementiert keinen String::operator +(std::string), d.h. es gibt garantiert keinen Stapelüberlauf, da einfach der +-Operator der Basisklasse verwendet wird!

    void DataStorageMgr::UnregisterDataDirectoryFactory(const String &strName)
    {
        GUARD(DataStorageMgr::UnregisterDataDirectoryFactory);
    
        // Remove specified instance of DataDirectory::Factory from the map
        DataDirectoryFactoryMap::iterator i = m_DataDirectoryFactoryMap.find(strName);
        if (i != m_DataDirectoryFactoryMap.end())
            m_DataDirectoryFactoryMap.erase(i);
        else
            AGEERROR(DataDirectoryFactoryNotFoundException, "Data storage factory '" + strName + "' not found!");
    
        UNGUARD;
    }
    
    DataDirectory::Factory &DataStorageMgr::GetDataDirectoryFactory(const String &strName) const
    {
        GUARD(DataStorageMgr::GetDataDirectoryFactory);
    
        // Return Pointer to specified instance of TScriptLanguage
        DataDirectoryFactoryMap::iterator i = m_DataDirectoryFactoryMap.find(strName);
        if (i != m_DataDirectoryFactoryMap.end())
            return *(i->second);
        else
            AGEERROR(DataDirectoryFactoryNotFoundException, "Data storage factory '" + strName + "' not found!");
    
        UNGUARD;
    }
    

    In Visual C++ 6.0 hat das problemlos compiliert, aber damit es in .net 2003 compiliert, muss ich aus dem Iterator in der zweiten Funktion einen const_iterator machen. Erst dachte ich, dass die STL halt etwas verbessert wurde bzgl. const correctness, aber in der ersten Funktion akzeptiert er den (nichtkonstanten) Iterator?

    ChrisM



  • lern erstmal programmieren, bevor du mit solchen profi tools arbeitest. 🙄



  • Tolle Antwort, wirklich.

    Zumindest mein String::operator+() ist ja wohl standardkonform, oder?

    ChrisM



  • Im Operator + kannst du doch nicht den Operator + selbst benutzen. Das wäre doch dann eine Rekursion und würde nie aufhören.



  • zu 1: Gibt es eine Möglichkeit (per nicht expliziten Konstruktor),daß std::string in AGE::String konvertiert wird?

    zu 2: Erscheint mir alles korrekt.
    UnregisterDataDirectoryFactory ist eine nicht konstante Memberfunktion,warum sollte dann der iterator const sein müssen?
    GetDataDirectoryFactory ist hingegen const,also muß der iterator auch const sein.



  • @ChrisM

    String String::operator +(const String &String) const
    {
        return *this + static_cast<std::string>(String);
    }
    

    Zumindest mein String::perator+() ist ja wohl standardkonform, oder?

    Standardkonform ja, aber rein vom logischen her unmöglich.
    Kleiner Denkanstoss:
    (*this) ist vom Typ String. Das heisst, es ist egal, ob der Typ hinter dem + nun gecastet wird oder nicht, es wird immer der Operator + der Klasse String aufgerufen und nie der der Basisklasse.



  • Ja, aber wenn die abgeleitete Klasse String keinen operator+(std::string) bietet, wird doch automatisch der operator+(std::string) der Basisklasse aufgerufen, oder?

    Oder soll ich auch noch ein static_cast<>() für den ersten String einbauen?

    Das andere Problem hat sich geklärt, weil ich grade gemerkt habe, dass es zwei Varianten von std:🗺:find() gibt: Eine, die einen iterator zurückgibt, und eine, die einen const_iterator zurückgibt 😃

    ChrisM



  • Ja, aber wenn die abgeleitete Klasse String keinen operator+(std::string) bietet, wird doch automatisch der operator+(std::string) der Basisklasse aufgerufen, oder?

    Was passiert denn Deiner Meinung nach dann, wenn die aktuelle Klasse von 2 Klassen abgeleitet ist, die den operator+(std::string) implementieren?



  • Compilerfehler?

    OK, hab jetzt auch den ersten Parameter static_gecasted (kein Overhead), mich wunderts halt nur, dass es unter VC++ 6.0 wunderbar funktioniert hat.

    ChrisM


Anmelden zum Antworten