On 21 Feb., 13:41, Gregor Szaktilla <
spam...@ktilla.de> wrote:
> Hallo zusammen!
>
> Ich beschäftige mich seit gestern mit der Deklaration eines set<> und komme
> nicht auf den richtigen Dreh.
>
> Meinem Verständis nach erhält die Deklaration eines set<> optional eine
> Funktion, die zwei Elemente des sets auf größer/kleiner prüft.
>
> Der Compiler (g++ 4.irgendwas) wirft mir aber immer irgendeine
> Fehlermeldung vor, die mir zu verstehen gibt, dass ich das noch nicht
> kapiert habe.
>
> Beispiel für die Deklaration (in main.cc):
>
> set<thing, sortThing> things;
>
> In main.hh die Definition von sortThing:
>
> bool sortThing(thing _a, thing _b)
> {
> if (_a.getX()<_b.getX())
> { return(true); }
> else
> { return(false); }
> }
>
> In diesem Fall bekomme ich
> error: expected a type, got ‘sortThing’
> zu lesen.
Eigentlich sagt der Compiler sogar genau, was er will - Er will einen
Typ,
du gibst ihm aber keinen;-)
std::set erwartet als zweites Template-Argument den *Typ* eines
Vergleich-Funktionsobjektes. Dies muss ein Objekttyp sein.
Wenn du also deine Funktion sortThing verwenden willst, ist der Typ
des
korrespondierenden Funktionsobjektes
bool(*)(thing, thing)
Das ist der Funktionszeigertyp, dem man deine Funktion zuweisen
kann.
Damit schreibst du dann schon mal
set<thing, bool(*)(thing, thing)> things;
Das ist aber noch nicht alles, da bei einem Funktionszeiger der Typ
nicht
ausreicht, um eine Funktion aufzurufen. Du musst also bei der
Konstruktion
des sets den Zeiger mitübergeben, also so:
set<thing, bool(*)(thing, thing)> things(sortThing);
Das sollte schon klappen. Ich persönlich ziehe es meistens vor, wenn
der Vergleichstyp auch direkt die Funktion mitliefert, dann muss ich
nicht
jedesmal bei der Konstruktion den Funktionszeiger angeben (Dies kann
allerdings auch vorteilhaft sein, weil man dynamisch die Ordnung
entscheiden
kann). Wenn dir eine statische Festlegung ausreicht, dann schreib dir
eine
einfache Vergleichsobjekt-Klasse, die man wie eine Funktion aufrufen
kann,
z.B. so:
struct MySortThing {
bool operator()(thing a, thing b) const { return sortThing(a, b); }
};
und definiere nun deinen Set so:
set<thing, MySortThing> things;
Jetzt ist der Typ MySortThing automatisch der Repäsentant für deine
Funktion und du brauchst bei der Konstruktion kein eigenes Objekt
anlegen (std::set verwendet ein default-konstruiertes Objekt deines
MySortThing).
Viel Erfolg und besten Gruss aus Bremen,
Daniel Krügler