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.