Problem mit stl::sort und Listen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Problem mit stl::sort und Listen

Beitrag von TRex » 04.12.2007 18:24:46

Hi,
ich hab ein kleines Problem mit meiner Liste:

Code: Alles auswählen

edgeTable.cpp:36: error: no matching function for call to ‘std::list<EntryList, std::allocator<EntryList> >::sort(<unresolved overloaded function type>)’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:238: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = EntryList, _Alloc = std::allocator<EntryList>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:343: note:                 void std::list<_Tp, _Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = bool (edgeTable::*)(EntryList, EntryList), _Tp = EntryList, _Alloc = std::allocator<EntryList>]
Er mag meine Vergleichsfunktion nicht...

Code: Alles auswählen

bool edgeTable::compare(EntryList a, EntryList b)
	{
	return a.gety() > b.gety();
	}
Aufgerufen wird die mit

Code: Alles auswählen

edgeTableListe.sort( compare );
wobei edgeTableListe vom Typ stl::list<EntryList> ist.

Ich verstehe vor allem folgenden Punkt nicht: bool (edgeTable::*)(EntryList, EntryList)
Kann mir da mal einer auf die Sprünge helfen..nach google müsste das so funktionieren.

Danke ;)

PS: mit einer ähnlichen Liste mit Pointern hatte ich dasselbe Problem, da bin ich einen anderen Weg gegangen (über operator overloading), wills jetzt aber mal "richtig" machen.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 04.12.2007 20:52:28

du solltest entweder statisches Linkage verwenden, z.B.

Code: Alles auswählen

static int ItemType::compare(const ItemType& item1, const ItemType& item2) {
  return ( item2.getValue() - item1.getValue() );
}

...

ItemListe.sort(  ItemType::compare );

oder du verwendest den operator (), z.B

Code: Alles auswählen

bool ItemType::operator() ( const ItemType& item1, const ItemType& item2) {
  return ( item1.getValue() < item2.getValue() );
}

ItemListe.sort( ItemType() );
Gruß
gms
Zuletzt geändert von gms am 04.12.2007 22:14:09, insgesamt 1-mal geändert.

Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Beitrag von TRex » 04.12.2007 22:10:22

Code: Alles auswählen

 error: cannot declare member function ‘static bool edgeTable::compare(EntryList&, EntryList&)’ to have static linkage
soviel zum ersten Anlauf...liegt das an dem const? Das kann ich nicht benutzen, weil ich über die get-Methode darin auch Variablen (indirekt über den Pointer) verändere...da beschwert sich der Compiler.

Mit dem Operator gehts, ich musste nur den edgeTableEntry() im sort angeben (das hatte ich nicht gewusst).

Ich würde aber trotzdem gerne wissen, wie das mit dem compare funktionieren würde. Wirkt auf mich um einiges eleganter und ich will das einfach wissen :)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 04.12.2007 22:19:17

ein kleines Beispiel:

Code: Alles auswählen

#include <iostream>
#include <list>

class Entry {

public:
	Entry(int n=0) : n(n) {}
	int GetValue() const { return n; } 

 	static bool compare( const Entry& e1, const Entry& e2) {return e1.GetValue()<e2.GetValue();}

private:
	int n;

};

typedef std::list<Entry> EntryList;


int main() {
	EntryList l;
        l.push_back(3);
        l.push_back(2);
        l.push_back(0);
        l.push_back(4);
	l.sort( Entry::compare );
	EntryList::iterator p = l.begin();
  	while(p != l.end()) {
    		std::cout << p->GetValue() << " ";
    		p++;
  	}
}

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 04.12.2007 22:32:23

TRex2003 hat geschrieben:soviel zum ersten Anlauf...liegt das an dem const? Das kann ich nicht benutzen, weil ich über die get-Methode darin auch Variablen (indirekt über den Pointer) verändere...da beschwert sich der Compiler.
nö, so gehts auch:

Code: Alles auswählen

#include <iostream>
#include <list>

class Entry {

public:
	Entry(int n=0) : n(n),i(0) {}
	int GetValue() { ++i; return n; } 

 	static bool compare( Entry& e1, Entry& e2) {return e1.GetValue()<e2.GetValue();}

private:
	int n;
	int i;

};

typedef std::list<Entry> EntryList;


int main() {
	EntryList l;
        l.push_back(3);
        l.push_back(2);
        l.push_back(0);
        l.push_back(4);
	l.sort( Entry::compare );
	EntryList::iterator p = l.begin();
  	while(p != l.end()) {
    		std::cout << p->GetValue() << " ";
    		p++;
  	}
}

Antworten