standard template library: sort() compile error



  • Hallo,

    ich bekomme folgende Fehlermeldungen, wenn ich mein Programm kompiliere:

    g++ -o stldemo stldemo.cpp
    stldemo.cpp: In function bool 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 function const \_Tp& std::\_\_median(const \_Tp&, const \_Tp&, const \_Tp&) [with _Tp = mark]': /usr/include/c++/3.2/bits/stl\_algo.h:2118: instantiated fromvoid 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 from void 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 forconst 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
    hampel

    Bitte Code-Tags verwenden!



  • Hallo,
    die Zeile

    if (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


Anmelden zum Antworten