2016-06-11 3 views
0

Ich habe Probleme mit der Verwendung der Funktion std :: sort mit meiner benutzerdefinierten Vergleichsfunktion, wenn in einer Klasse definiert.Std :: Sortierfunktion mit benutzerdefinierten Vergleich Funktion Ergebnisse Fehler: Verweis auf nicht statische Elementfunktion muss aufgerufen werden

class Test { 
    private: 
     vector< vector<int> > mat; 
     bool compare(vector<int>, vector<int>); 
    public: 
     void sortMatrix(); 
} 

bool Field::compare(vector<int> a, vector<int> b) { 
    return (a.back() < b.back()); 
} 

void Test::sortMatrix() { 
    sort(vec.begin(), vec.end(), compare); 
} 

bekomme ich folgende Fehlermeldung:

error: reference to non-static member function must be called 
     sort(vec.begin(), vec.end(), compare); 
            ^~~~~~~ 

Wenn ich vergleiche jedoch define() und sortMatrix() in der Datei main.cpp ohne Klasse, funktioniert alles einwandfrei. Ich würde jede Hilfe und Vorschläge schätzen.

+0

Sie können dort keine Memberfunktion verwenden, ändern Sie sie in 'Test' Klasse Aufrufoperator und übergeben Sie' Test' statt '' sort() 'stattdessen:' sort (vec.begin(), vec.end(), Test); ' –

Antwort

0

Um compare aufzurufen, benötigen Sie ein Objekt Field. Man könnte es ein ein Lambda-Anruf von dort verwenden, wenn Sie C++ 11-Unterstützung:

sort(vec.begin(), vec.end(), [this] (vector<int> a, vector<int> b) { 
    return compare(a, b); }); 

Oder gerade aus der Klasse Ihre Vergleichsmethode bewegen, brauchen Sie nicht, es trotzdem Mitglieder zuzugreifen ist.

+0

Danke, ich werde das ausprobieren. Der Vergleich ist eigentlich eine Funktion von Test, ich habe einen Tippfehler gemacht. bool Test :: vergleichen (.. – Lennart

0

Vielen Dank für den Kommentar πάντα ῥεῖ. Ihr Tipp funktioniert sehr gut, ich endete mit einer Klasse vergleichen und einen Operator aufgerufen.