sort aus <algorithm>



  • Hallo,

    ich möchte den sort Algorithmus aus <algorithm> benutzen.

    Leider kommt da ne Fehlermeldung:

    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = Platoon]’:
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:1919: instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Platoon*, std::vector<Platoon, std::allocator<Platoon> > >, _Size = int]’
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:4783: instantiated from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Platoon*, std::vector<Platoon, std::allocator<Platoon> > >]’
    main.cpp:56: instantiated from here
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:93: error: no match for ‘operator<’ in ‘__a < __b’
    Platoon.h:20: note: candidates are: bool Platoon::operator<(Platoon&)
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:94: error: no match for ‘operator<’ in ‘__b < __c’
    Platoon.h:20: note: candidates are: bool Platoon::operator<(Platoon&)
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:96: error: no match for ‘operator<’ in ‘__a < __c’
    Platoon.h:20: note: candidates are: bool Platoon::operator<(Platoon&)
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h💯 error: no match for ‘operator<’ in ‘__a < __c’
    Platoon.h:20: note: candidates are: bool Platoon::operator<(Platoon&)
    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:102: error: no match for ‘operator<’ in ‘__b < __c’
    Platoon.h:20: note: candidates are: bool Platoon::operator<(Platoon&)

    Teil C++ Code

    typedef std::vector< Platoon > PlatoonVector;
    PlatoonVector platoons;
    std::sort(platoons.begin(), platoons.end());
    

    Und < Operator auch in der Klasse platoons überladen:

    bool Platoon::operator<(Platoon& p) {
    return platoonID < p.platoonID;
    }
    

    Woran liegt es, dass sich das Programm nicht kompilieren lässt?

    Gruß Geddon



  • Ich sehe da eigentlich nichts falsches. Mach doch bitte mal ein Minimalbeispiel, wo der Fehler auftritt.

    Du hast ja eigentlich das hier:

    struct foo
    {
     int n;
     bool operator < ( const foo& rhs )
     {
       return n < rhs.n;
     }
    };
    
    int main ()
    {
     std::vector<foo> foos;
     std::sort ( foos.begin (), foos.end () );
    }
    

    Und das geht ohne Probleme (MSVC++2008)



  • drakon schrieb:

    Ich sehe da eigentlich nichts falsches. Mach doch bitte mal ein Minimalbeispiel, wo der Fehler auftritt.

    Du hast ja eigentlich das hier:

    struct foo
    {
     int n;
     bool operator < ( const foo& rhs )
     {
       return n < rhs.n;
     }
    };
    
    int main ()
    {
     std::vector<foo> foos;
     std::sort ( foos.begin (), foos.end () );
    }
    

    Und das geht ohne Probleme (MSVC++2008)

    Geht bei mir unter netbeans nicht.

    Da kommt const Fehler.

    Wenn ich dann das const wegmache bei "bool operator < ( foo& rhs )" kommen auch wieder die gleichen Fehler mit Operator< nicht auffindbar.

    Das komplette Programm befindet sich unter http://www.fbi.h-da.de/organisation/personen/weber-hans-peter/programmieren-2-bachelor-2semester/vorlesung-programmieren-2.html bei den 6 Dateien von Kapitel 20



  • es muss bool operator(const T&) const



  • asdfasd schrieb:

    es muss bool operator(const T&) const

    Das habe ich total vergessen.

    Aber afaik ist das kein notwendiges Kriterium.. 😕



  • #include <iostream>
    #include <vector>
    #include <algorithm>  // std::sort
    
    using namespace std;
    
    struct foo {
        int n;
    
        bool operator<(foo & rhs) const {
            return (n < rhs.n);
        }
    };
    
    int main() {
        std::vector<foo> foos;
        std::sort(foos.begin(), foos.end());
    }
    

    lässt sich bei mir nicht kompiliern weger mit netbeans noch mit eclipse

    /usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algo.h:102: error: no match for ‘operator<’ in ‘__b < __c’
    main.cpp:10: note: candidates are: bool foo::operator<(foo&) const



  • Zweimal const!



  • const auch ins Argument! Beides muss!



  • ah ok thx



  • Den operator< würde ich übrigens als freie Funktion überladen.

    bool operator< (const foo& lhs, const foo& rhs);
    

    Dieses Vorgehen erspart nämlich seltene, aber dafür umso verwirrendere Konvertierungsfehler aufgrund der nicht vorhandenen Symmetrie. Ausserdem wäre an dieser Deklaration unmittelbar ersichtlich gewesen, dass nicht nur ein Parameter const -qualifiziert sein kann.


Anmelden zum Antworten