std::sort kennt meinen operator< nicht



  • hola

    hab in meiner directory-klasse einen vector<file_data>.
    die klasse file_data beinhaltet den operator<.

    [C++ Fehler] _function_base.h(73): E2093 'operator<' ist im Typ 'file_data' für Argumente desselben Typs nicht implementiert
    

    das ist dann die fehlermeldung.

    template <class _Tp>
    struct less : public binary_function<_Tp,_Tp,bool> 
    {
      bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }//1 
    };
    

    das is die zeile in der fehlermeldung

    bool operator<(const file_data &fd) { return filename.compare(fd.filename) < 0 ? true : false; }
    

    das habe ich in public bereich meiner file_data klasse stehen.

    erlich gesagt versteh ich die fehlermeldung inhaltlich nicht ganz.

    bitte um hilfe

    cermy

    Meep Meep



  • Hallo,
    wenn du den Operator< unbedingt als Memberfunktion implementieren willst, dann muss diese Memberfunktion const sein:

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }
    

    Außerdem solltest du daran denken, dass ein Vergleich bereits einen Wert hat. Den explizites true : false ist völlig unnötig.

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }
    


  • re

    HumeSikkins schrieb:

    Hallo,
    wenn du den Operator< unbedingt als Memberfunktion implementieren willst, dann muss diese Memberfunktion const sein:

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }
    

    Außerdem solltest du daran denken, dass ein Vergleich bereits einen Wert hat. Den explizites true : false ist völlig unnötig.

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }
    

    warum muss ich den operator< const machen ? macht das einen sinn ?
    warum ist explizites true : false unnoetig ?
    compare gibt bei kleiner -1, bei gleich 0 und bei groesser 1 zurueck.
    compare wuerde also nur bei == false zurueckgeben, bei < || > wuerde er true geben. oder seh ich das falsch ?

    Meep Meep



  • Meep Meep schrieb:

    warum muss ich den operator< const machen ? macht das einen sinn ?

    Natürlich macht das einen Sinn. Schau dir doch mal die Definition von std::less an, die dir dein Compiler ja freundlicherweise bereits ausgespukt hat:

    template <class _Tp>
    struct less : public binary_function<_Tp,_Tp,bool> 
    {
      bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }//1 
    };
    

    Wenn du den Operator< als Member implementiert hast, dann bedeutet

    return __x < __y;
    

    ja nix anderes als:

    return __x.operator <( __y);
    

    Nun schau dir die Deklaration von __x in diesem Kontext an:

    bool operator()(const _Tp& __x, const _Tp& __y) const
    

    __x ist eine Referenz auf ein *konstantes* Objekt, d.h. über diese Referenz kannst du, im Sinne der const-correctness, demzufolge natürlich auch nur const-Memberfunktionen aufrufen. Ergo muss deine Implementation des operator< eine const-Memberfunktion sein.

    warum ist explizites true : false unnoetig ?

    Diese Frage solltest du dir, wenneigentlich selbst beantworten können.
    Der Operator? hat doch die Form:

    boole'sche-Bedingung ? true-Fall : false-Fall;
    

    Also ist:

    return filename.compare(fd.filename) < 0 ? true : false;
    

    äquivalent zu:

    return (filename.compare(fd.filename) < 0) == true ? true : false;
    

    und das ist, wie du hoffentlich siehst, äquivalent zu

    return filename.compare(fd.filename) < 0;
    


  • du musst ihn const machen, damit er auch für konstante Objekte aufgerufen werden kann, nehme ich an.

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }

    ist das selbe wie

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }

    Der Grund ist einfach, das der Vergleich ( < 0 ) schon einen boolschen Wert zurueckliefert. Dieser ist true, wenn es eben kleiner Null ist. Du unterstuetzt das nochmal und sagst, dass er true zurueckliefern soll, wenn der Vergleich true liefert 😉
    Hoffe das ist verstaendlich.
    Allerdings ist es nicht zu verwechseln mit

    bool operator<(const file_data &fd) const { return filename.compare(fd.filename); }

    Denn hier wird true geliefert, wenn das Ergebnis von Compare undgleich Null ist.

    Gruss,
    DeSoVoDaMu



  • re

    danke fuer die erklaerung . jetz hab ichs kapiert

    Meep Meep


Anmelden zum Antworten