Fehlermeldung bei != oder == mit string
-
Hiho,
ich habe eine Klasse namens sorted Array geschrieben. Diese soll dann mit allen möglichen Typen arbeiten können, deshalb nutzt sie template<class T>
Nunja, natürlich möchte ich die Klasse nun testen und habe darum ein kleines Programm geschrieben das einfach nur ein paar Strings ins Array schreibt, dann ausgibt, einen löscht, wieder ausgibts usw.
Beim compilieren kommt es nun bei der fett geschriebenen Zeile zu einem Fehler:
[cpp]
T &find(const T &toFind)
{
int found=findIndex(toFind);
if(found!=-1)
return &m_data[found];
else
return 0;
}bool has(const T &toFind)
{
return (find(toFind)!=0);
}
[/cpp]Das ganze mit folgender fehlermeldung:
sortedArray.h(48) : error C2676: binary '!=' : 'class std::basic_string<char,str
uct std::char_traits<char>,class std::allocator<char> >' does not define this op
erator or a conversion to a type acceptable to the predefined operator
sortedArray.h(47) : while compiling class-template member function 'bool
__thiscall sortedArray<class std::basic_string<char,struct std::char_traits<cha
r>,class std::allocator<char> > >::has(const class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> > &)'Ich benutze den cl compiler und schreibe meine Programme einfach im Editor und kompiliere und starte sie danach in der MS-DOS eingabeaufforderung.
Ich hoffe ihr könnt mir bei dem Problem helfen... und dass es kein zu dummes ist, so das sich nachher den Kopf vor scham in den Sand stecken müsste...
-
Der Grund ist erschlagend einfach: 0 ist kein String (ich nehme an T == std::string). Die Zeile return 0 in der find-Funktion sollte eigentlich auch auf einen Fehler laufen. Wenn Du damit ausdrücken willst "nicht gefunden", kannst Du in diesem Fall höchstens eine Exception werfen.
Allgemeiner: Du kannst an eine nichtkonstante Referenz kein rvalue binden.
-
es gibt keine "null-referenzen" in C++. du könntest nat. ein spezielles element in deinem container anlegen, dass dafür steht, dass es kein passendes element im container gibt. sinnvoller dürfte aber sein, einen zeiger oder iterator als rückgabewert zu verwenden, der auf natürliche weise singuläre werte annehmen kann.
-
Als weitere Alternativen könntest du auch Pointer verwenden statt der Referenzen - damit funktioniert sowohl das "return 0;" als auch der Vergleich mit dem NULL-Zeiger.