derbe Fehlermeldung bei Verwendung von std::sort()



  • Hi!
    Ich habe mir eine Klasse CCornerVal gemacht, die eine Ecke in einem Bild repräsentieren soll:

    class CCornerVal
    {
    public:
        int x;
        int y;
        double m_strength;  //Lambda-Wert
    
        cornerVal() {x = 0; y = 0; m_strength = 0; isClear = false;}
        CCornerVal(const CCornerVal &a) {x = a.x; y = a.y; m_strength = a.m_strength; isClear = a.isClear;}
        bool operator< (cornerVal &a) { return (m_strength < a.m_strength); }
    };
    

    In meinem Programm habe ich jetzt einen vector mit verschiedenen Einträgen von eben diesen Ecken:

    //...
    std::vector<CCornerVal> foundCorners;
    //...
    tempCorner.x = x;
    tempCorner.y = y;
    tempCorner.m_strength = lambda2;
    foundCorners.push_back(tempCorner);
    

    Diesen vector will ich jetzt sortieren, und zwar mit std::sort(). Also:

    std::sort(foundCorners.begin(), foundCorners.end());
    

    Sobald ich entsprechende "sort-Zeile" aber in meinen Programmcode aufnehme, haut mir mein Compiler (ich benutze Dev-C++ 4.9.9.2, k.A. was für einen Compiler das nutzt) aber diese wüste Fehlermeldung um die Ohren und der Editor deutet dabei auf Code aus der stl_algo.h:

    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h: In function `const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = cornerVal]':
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:2484:   instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<cornerVal*, std::vector<cornerVal, std::allocator<cornerVal> > >, _Size = int]'
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:2555:   instantiated from `void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<cornerVal*, std::vector<cornerVal, std::allocator<cornerVal> > >]'
    klt-corner.cpp:192:   instantiated from here
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:90: error: no match for 'operator<' in '__a < __b'
    plugin-pool/my_corners.h:15: note: candidates are: bool cornerVal::operator<(cornerVal&)
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:91: error: no match for 'operator<' in '__b < __c'
    plugin-pool/my_corners.h:15: note: candidates are: bool cornerVal::operator<(cornerVal&)
    
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:93: error: no match for 'operator<' in '__a < __c'
    plugin-pool/my_corners.h:15: note: candidates are: bool cornerVal::operator<(cornerVal&)
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:97: error: no match for 'operator<' in '__a < __c'
    
    plugin-pool/my_corners.h:15: note: candidates are: bool cornerVal::operator<(cornerVal&)
    C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:99: error: no match for 'operator<' in '__b < __c'
    plugin-pool/my_corners.h:15: note: candidates are: bool cornerVal::operator<(cornerVal&)
    
    make.exe: *** [klt-corner.o] Error 1
    
    Ausführung beendet
    

    Bin mit meinem Latein am Ende, aber von euch weiß sicherlich wer eine Lösung..



  • Edit: Unsinn geschrieben 🤡

    Funktioniert es, wenn du den Operator mit den passenden consts versiehst?

    bool operator< (const cornerVal &a) const
    


  • Vielen Dank!

    Ja, das tut es! Könntst Du mir kurz erklären, wofür ich das ertse 'const' brauche und was das zweite 'const' hinter dem Funktionskopf tut (ist mir gar nicht geläufig von der Syntax her..), nur damit ich in Zukunft Bescheid weiß.

    Edit kurz danach:
    Hey, das hat gar nicht an den 'const' gelegen. Hab gleichzeitig nämlich noch was anderes geändert:

    CCornerVal(const CCornerVal &a)
        { this->x = a.x; this->y = a.y; this->m_strength = a.m_strength; this->isClear = a.isClear; }
    
        bool operator<(CCornerVal &a)
        { return (this->m_strength < a.m_strength); }
    

    Jetzt steht vor jedem Zugriff auf Membervariablen das this->.
    Merke: sollte ich mir angewöhnen!

    Edit weitere 30 min später:
    Hm, grade hat er kompiliert und ausgeführt ohne die const, jetzt hab ich was Minimales geändert und er kompiliert mir wieder nur mit const. Versteh ich zwar net, aber auch egal, solange er überhaupt kompiliert...

    Grüße
    FellaR



  • Das erste const vor dem Argument gibt an, dass die zu vergleichende CCornerVal-Referenz a nicht veränderbar ist und das const am Ende gibt an, dass diese Funktion an der eigenen Klasse nichts verändert und auch nicht verändern kann (der this-Pointer (ob du ihn schreibst oder nicht) ist also innerhalb der Operator-Methode ebenfalls const.)



  • Was ist cornerVal()?? Wenn ich deinen Code kompiliere bekomme ich:

    10 C:\Dev-Cpp\main7.cpp ISO C++ forbids declaration of `cornerVal' with no type
    

    mfg.



  • @joomoo: cornerVal sollte eigentlich CCornerVal heißen, hab zuerst gepostet, dann ist mir eingefallen, dass man Klassen ja immer groß schreibt und mit C beginnt. Da ich auf Belehrungen wie "eigne Dir doch erst mal die Konventionen an, du n00b" verzichten wollte, hab ich dann das cornerVal zu CCornerVal gemacht und einen Eintrag vergessen abzuändern.



  • Fellar schrieb:

    @joomoo: cornerVal sollte eigentlich CCornerVal heißen, hab zuerst gepostet, dann ist mir eingefallen, dass man Klassen ja immer groß schreibt und mit C beginnt. Da ich auf Belehrungen wie "eigne Dir doch erst mal die Konventionen an, du n00b" verzichten wollte, hab ich dann das cornerVal zu CCornerVal gemacht und einen Eintrag vergessen abzuändern.

    BTW: Das mit dem C beginnen ist nicht pflicht, das sieht jeder anders. Siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-41464.html

    Also ich habe es jetzt abgeändert und bekomme die Fehlermeldung:

    10 C:\Dev-Cpp\main7.cpp `isClear' undeclared (first use this function)
    

    mfg.



  • joomoo schrieb:

    Also ich habe es jetzt abgeändert und bekomme die Fehlermeldung:

    10 C:\Dev-Cpp\main7.cpp `isClear' undeclared (first use this function)
    

    mfg.

    Oh mann, da hab ich wohl ziemlichen Mischmasch gepostet. isClear ist ein Member, dessen Deklaration ich aber in dem Post hier entfernt habe, da er keinen wichtigen Beitrag zu meinem Problem leistet. Im Konstruktor natürlich vergessen. Aber eh egal, das Problem is ja gelöst. Danke dass Du dir die Mühe gemacht hast.

    Grüße
    FellaR



  • Fellar schrieb:

    Aber eh egal, das Problem is ja gelöst.

    Da hab ich erstmal huch gemacht, und dann sind mir die zwei Beiträge von masterofx32 aufgefallen, hatte ich echt übersehen. 😃

    mfg.


Anmelden zum Antworten