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.


  • Mod

    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.


Anmelden zum Antworten