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.
-
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