Fehler bei Anwendung des Sort-Algorithmus



  • Dieser Beitrag wurde gelöscht!


  • Du solltest dazuschreiben, in welcher Zeile der Compiler-Fehler gemeldet wird. Ich nehme mal an, bei right.getCosts()?
    Hast du diese Funktion auch als const definiert?

    Du kannst aber auch einfach right.costs schreiben (der Aufruf findet in derselben Klasse statt, d.h. man kann auf alle - auch private - Member einer anderen Klasseninstanz zugreifen).



  • Moin, erstmal danke für die schnelle Antwort. Ja, die Fkt getCosts() ist ebenfalls als const deklariert, der gleiche Fehler kommt aber auch, wenn ich das Atribut Cost als public setze und direkt darauf zugreife, also scheint nicht wirklich mit der Funktion zusaammen zu hängen. der Compiler meldet das Problem nicht an einer spezifischen Zeile in meinem Code. Die vollständige Fehlermeldung lautet:
    C:/Programmierpraktikum/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algobase.h:548:18: error: cannot bind non-const lvalue reference of type 'expense&' to an rvalue of type 'std::remove_reference<expense&>::type' {aka 'expense'}

    LG



  • Sieht dein Aufruf so:

    
    std::vector<expense> vec;
    ...
    std::sort(vec.begin(), vec.end());
    
    

    aus?
    Der operator sieht jedenfalls ok aus.



  • @Jockelx
    Ja, mein Test-aufruf ist wie folgt:

    std::vector<expense> ausgabenliste;
    expense ausgabe1("Ausgabe_1", "23.09.2000", 20.15);
    expense ausgabe2("Ausgabe_2", "24.09.2000", 21.15);
    expense ausgabe3("Ausgabe_3", "25.09.2000", 22.15);
    ausgabenliste.push_back(ausgabe1);
    ausgabenliste.push_back(ausgabe2);
    ausgabenliste.push_back(ausgabe3);
    
    std::sort(ausgabenliste.begin(), ausgabenliste.end());
    

    , also entspricht soweit ich das beurteilen kann dem von dir.



  • @jada178 sagte in Fehler bei Anwendung des Sort-Algorithmus:

    Moin, erstmal danke für die schnelle Antwort. Ja, die Fkt getCosts() ist ebenfalls als const deklariert, der gleiche Fehler kommt aber auch, wenn ich das Atribut Cost als public setze und direkt darauf zugreife, also scheint nicht wirklich mit der Funktion zusaammen zu hängen. der Compiler meldet das Problem nicht an einer spezifischen Zeile in meinem Code. Die vollständige Fehlermeldung lautet:
    C:/Programmierpraktikum/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algobase.h:548:18: error: cannot bind non-const lvalue reference of type 'expense&' to an rvalue of type 'std::remove_reference<expense&>::type' {aka 'expense'}

    Ist das wirklich vollständig? Normalerweise sollte da noch mehr stehen, nämlich von wo das aufgerufen wurde.

    Ansonsten: minimales, vollständiges Beispiel!

    Und noch was. Das hier:

    if(this->costs<right.getCosts())
    {
        return true;
    }
    else
    {
        return false;
    }
    

    Kannst du viel kürzer schreiben als:

    return costs < right.costs;
    

    (das wird aber nichts an deinem Problem ändern)



  • @wob Moin, bin noch ziemlich neu dabei, also danke für den Tipp. Die Fehlermeldung ist so tatsächlich vollständig, wenn man drauf klickt wird immer die Zeile std::sort(...) aufgerufen, aber wenn ich versuche mit dem debugging da genauer hinterzukommen, verstehe ich da leider noch nichts von...



  • Kannst du die expense-ojekte fehlerfrei kopieren/moven?

    expense e1;
    expense e2 = e1;
    e1 = e2;
    e2 = std::move(e1);
    expense e3 = std::move(e2);
    


  • Wenn man dein Programm auf das Wesentliche reduziert, kompiliert es:

    #include <algorithm>
    #include <string>
    #include <vector>
    
    struct expense {
        std::string name;
        std::string date;
        double costs;
    
        bool operator<(const expense& right) const {
            return costs < right.costs;
        }
    };
    
    int main() {
        std::vector<expense> ausgabenliste;
        expense ausgabe1{"Ausgabe_1", "23.09.2000", 20.15};
        expense ausgabe2{"Ausgabe_2", "24.09.2000", 21.15};
        expense ausgabe3{"Ausgabe_3", "25.09.2000", 22.15};
        ausgabenliste.push_back(ausgabe1);
        ausgabenliste.push_back(ausgabe2);
        ausgabenliste.push_back(ausgabe3);
    
        std::sort(ausgabenliste.begin(), ausgabenliste.end());
    }
    

    Du hast also vermutlich irgendwas mit deiner Klasse expense gemacht, das zum Fehler führt.



  • @Jockelx Moin, also die Zuweisungen in Zeile 2 und drei funktionieren, danach taucht der selbe Fehler auf, für std::move()!



  • @wob Ob ich expense als class, oder struct definiere, dürfte in dem Kontext eig keinen Unterschied machen, oder?


  • Mod

    @jada178 sagte in Fehler bei Anwendung des Sort-Algorithmus:

    @wob Ob ich expense als class, oder struct definiere, dürfte in dem Kontext eig keinen Unterschied machen, oder?

    Es geht darum, dass du uns irgendeinen wesentlichen Teil deines Programms nicht zeigst. Denn wenn wir alles, was du uns bis jetzt gezeigt hast, zu einem vollständigen Programm zusammen setzen, dann gibt es keinen Fehler.

    Siehe hier den zweiten Abschnitt darüber, wie man Probleme nachvollziehbar macht.



  • @jada178 sagte in Fehler bei Anwendung des Sort-Algorithmus:

    @wob Ob ich expense als class, oder struct definiere, dürfte in dem Kontext eig keinen Unterschied machen, oder?

    Nein, er einzige Unterschied ist, dass bei struct standardmäßig alles public ist, während bei class standardmäßig alles private ist.

    Hast du irgendwelche Copy- oder Move-Konstruktoren definiert? Oder operator=? Was für Datentypen verwendest du in deiner Klasse? Bitte Minimalbeispiel, ich kann nicht raten, was du gemacht hast. (Edit: @SeppJ hats gerade auch schon gesagt)



  • Die Fehlermeldung müßte aber noch mehr Infos geben (u.a. auch auf den direkten Aufruf aus deinem Code heraus). Wie sieht denn der Aufruf der sort-Funktion bei dir aus?


Anmelden zum Antworten