std::string - = = - operator funktioniert nicht
Habe ich mit std::string s = = - operator seit Jahren auf windows und linux. Jetzt bin ich kompilieren einer meiner Bibliotheken auf linux, verwendet == stark. Auf linux in der folgenden Funktion schlägt fehl, weil die == gibt false zurück, selbst wenn die strings gleich sind (case Sensitiv Weise gleich)
const Data* DataBase::getDataByName( const std::string& name ) const
{
for ( unsigned int i = 0 ; i < m_dataList.getNum() ; i++ )
{
if ( m_dataList.get(i)->getName() == name )
{
return m_dataList.get(i);
}
}
return NULL;
}
Die getName () - Methode ist wie folgt deklariert
virtual const std::string& getName() const;
Baue ich mit gcc 4.4.1 und libstdc++44-4.4.1.
Irgendwelche Ideen? es sieht vollkommen gültig zu mir.
Paul
- nur eine kurze Anmerkung: std::string tmpStr1 = name; std::string tmpStr2 = m_dataList.get(i)->getName() ; if ( tmpStr1 == tmpStr2 ) ... Das funktioniert bestens, wie erwartet.
- getName liefert eine Referenz. Ist der Verweis noch gültig?
- Imposable zu sagen, was falsch ist mit dem angegebenen code. Der Fehler woanders liegt. Was ist der code für die Daten::getName(). Ein weiterer posability ist, dass Sie überschrieb die operator==() versehentlich haben Sie versucht, betreten es, um sicherzustellen, dass Sie die standard-Implementierung?
- bitte fügen Sie einer Antwort, die weiter auf Ihren Kommentar ein. Es ist wahrscheinlich die richtige Antwort, aber andere können es nicht sehen, mit ein Beispiel.
- Ich denke, dass Paul ' s Kommentar-Regeln aus einfachen, veralteten Verweise. Vergleich der Kopien der Objekte sollten die gleiche Arbeit im Vergleich zu den Objekten. Das klingt wie eine Art compiler oder library-Fehler. Mein Rat wäre, so aktivieren Sie den Debugger, versuchen zu reproduzieren, und single-step durch die Bibliothek, wenn so. Wenn nicht, setzen Sie auf ein paar Handschuhe, und versuchen Sie aufzuspüren, welche Optimierung den es auslöst.
- Tut !strcmp(m_dataList.get(i)->getName().c_str(), Namen.c_str()) == 0 arbeiten?
- Tut dies immer fehlschlagen, oder nur zeitweise? Scheitert es mit bestimmten sub-Klassen von der Art, dass Ihre virtuelle getName() definiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich kaum ein problem mit Ihrem code. Es scheint, dass der Ursprung der Fehler woanders liegt.
Ich denke, dass Sie das Referenz einer lokalen Variablen.
Siehe mein Beispiel:
Ausgabe auf meinem Rechner:
Allerdings erlebte ich in einigen Umgebungen die offenen Ausgang. Es ist ein Ungültiger code, aber das Verhalten ist nicht definiert. Scheinbar, oft funktioniert es einwandfrei.
Watch out für die Kompilierung Warnungen wie:
Können Sie auch versuchen, kompilieren Sie Ihren code mit der option "-Wall" und sehen, ob die Warnung zeigen Sie keine wirklichen Probleme.
(Shot in the dark hier, wie ich nicht sehen, nichts falsch mit Ihrem code-Beispiel)
Vielleicht Ihre Gleichheits-operator ist überladen anderswo? Abgesehen von den code schrittweise Durchlaufen, um zu sehen, eine andere Art, ist der explizite Aufruf der Gleichheits-operator, den Sie versuchen zu erreichen, die von std::. Zum Beispiel:
Ausgeben sollte: