Seite 1 von 1

float als Index für QMap - unscharfer Vergleich

Verfasst: 4. Juli 2012 11:18
von Cherubim
Hallo Forum,

ich würde gerne eine Map einsetzen, die als key einen float hat.
Damit das funktioniert, hätte ich mir gedacht das ich von der QMap ableite und den Vergleichsoperator für float hinzuufüge.
Als Vergleichsfunktion könnte ich dann die 'qFuzzyCompare' nehmen.
Float als key ist leider alles andere als optimal, aber leider gibt es für mich keine andere Möglichkeit.

Mein Problem ist das ich es nicht schaffe überhaupt von qmap abzuleiten. Bei dem Versuch einach nur ein leere Klasse abzuleiten bekomme ich die Fehlermeldung:

Code: Alles auswählen

Fehler:expected class-name before ‘{’ token
Ist mein Ansatz überhaupt so richtig oder kann ich das Problem irgendwie "schöner" lösen?

Danke im Vorraus!
lg Cheru

Re: float als Index für QMap - unscharfer Vergleich

Verfasst: 4. Juli 2012 11:38
von franzf
Ohne Code zum Fehler kann man nicht sagen was du falsch gemacht hast.
Allgemein sind Containerklassen nicht zum Ableiten gedacht (generelles Indiz: Kein virtueller Destruktor -> lass Ableiten besser bleiben!)
QMap braucht einen passenden operator< für den key. Leider kann man den nicht für float (wie für alle built-in types) überladen. Deshalb brauchst du eine Wrapper-Klasse um float:

Code: Alles auswählen

class Float {
float data_;
public:
    Float(float d)
     : data_(d)
    {}

    operator float() const
    {
        return data_;
    }

    float data() const
    {
        return data_;
    }
};

bool operator< (Float l, Float r) {
    return qFuzzyCompare(l,r);
}
Und dann Float als key für die map nehmen.
Fehler darfst du behalten :P

Re: float als Index für QMap - unscharfer Vergleich

Verfasst: 4. Juli 2012 12:04
von Cherubim
Danke für deine schnelle AW franzf!
Ist klar, der Ccode war aber nur eine komplett leere Klasse bei der es schon Probleme gab. Der war nicht so aufregend ;)
Vielen Dank, da habe ich wieder etwas dazu gelernt.

Ich werd mich mal über die Wrapper Klasse stürzen. Damit ist das Problem dann auch erledigt. Vielen Dank nochmal !

lg,
Cheru