standard template library: sort() compile error
-
Hallo,
ich bekomme folgende Fehlermeldungen, wenn ich mein Programm kompiliere:
g++ -o stldemo stldemo.cpp
stldemo.cpp: In functionbool operator<(mark&, mark&)': stldemo.cpp:20: cannot convert \
bool' to `const char*' for argument `1' to `int
strcmp(const char*, const char*)'
/usr/include/c++/3.2/bits/stl_algo.h: In functionconst \_Tp& std::\_\_median(const \_Tp&, const \_Tp&, const \_Tp&) [with _Tp = mark]': /usr/include/c++/3.2/bits/stl\_algo.h:2118: instantiated from
void std::__introsort_loop(_RandomAccessIter, _RandomAccessIter, _Size) [with _RandomAccessIter = __gnu_cxx::__normal_iterator<mark*, std::vector<mark, std::allocator<mark> > >, _Size =
int]'
/usr/include/c++/3.2/bits/stl_algo.h:2178: instantiated fromvoid std::sort(\_RandomAccessIter, \_RandomAccessIter) [with \_RandomAccessIter = \_\_gnu\_cxx::\_\_normal\_iterator<mark*, std::vector<mark, std::allocator<mark> > >]' stldemo.cpp:61: instantiated from here /usr/include/c++/3.2/bits/stl_algo.h:90: no match for
const mark& < const
mark&' operator
stldemo.cpp:19: candidates are: bool operator<(mark&, mark&)
...Hier mein Programm:
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct mark { char name[50]; unsigned short mk; }; void putmk(mark &m) { cout << m.name << ": " << m.mk << "\n"; } bool operator < (mark &m1, mark &m2) // Vergleichsoperator < für Sortierung { if (strcmp(m1.name < m2.name) < 0) return (true); return (false); } int main(void) { vector <mark> a(2); vector <mark> b(3); // Werte in Container übertragen strcpy(a[0].name, "Caesar"); strcpy(a[1].name, "Berta"); strcpy(a[2].name, "Anton"); strcpy(a[3].name, "Emil"); strcpy(a[4].name, "Dora"); a[0].mk = 5; a[1].mk = 4; b[0].mk = 3; b[1].mk = 2; b[2].mk = 1; cout << "Kurs A: " << a.size() << " Teilnehmer. " << "Maximale T-Zahl: " << a.max_size() << "\n"; cout << "Kurs B: " << b.size() << " Teilnehmer. " << "Maximale T-Zahl: " << b.max_size() << "\n"; cout << "\nKurs A:\n"; for_each(a.begin(), a.end(), putmk); // for_each: STL - Schleifenersatz cout << "\nKurs B:\n"; for_each(b.begin(), b.end(), putmk); cout << "Teilnehmertausch"; a.swap(b); // swap: Containerinhalte vertauschen sort(a.begin(), a.end()); // Sortieren für Vergleichsoperationen sort(b.begin(), b.end()); cout << "\nKurs A neu:\n"; for_each(a.begin(), a.end(), putmk); cout << "\nKurs B neu:\n"; for_each(b.begin(), b.end(), putmk); cout << "Kurs B in umgekehrter Reihenfolge:\n"; for_each(b.rbegin(), b.rend(), putmk); // rückwärtszählender Iterator (Zeiger auf Containerelement) }
Warum bekomme ich diese Fehler?
Muss ich noch eine library linken?grüße
hampelBitte Code-Tags verwenden!
-
Hallo,
die Zeileif (strcmp(m1.name < m2.name) < 0)
sollte wohl eher
if (strcmp(m1.name, m2.name) < 0)
heißen.
Das ganze lässt sich vereinfacht auch so schreiben:
bool operator < (const mark& m1, const mark& m2) { return strcmp(m1.name, m2.name) < 0; }
-
Vielen Dank!
Jetzt funktionierts:-)
Gruß
hampel