2015-03-26 12 views
6

Ich habe so etwas wie dies:ungültige Verwendung von nicht-statischer Member-Funktion

class Bar 
     { 
     public: 
     pair<string,string> one; 
     std::vector<string> cars; 
     Bar(string one, string two, string car); 
     }; 

class Car 
     { 
     public: 
     string rz; 
     Bar* owner; 
     Car(string car, Bar* p); 
     }; 

class Foo 
     { 
     public: 
      Foo (void); 
      ~Foo (void); 
      int Count (const string & one, const string & two) const; 
      int comparator (const Bar & first, const Bar & second) const;    
      std::vector<Bar> bars; 
     }; 

int Foo::comparator(const Bar & first, const Bar & second) const{ 
    return first.name < second.name; 
} 

int Foo::Count (const string & one, const string & two) const{ 
    int result=0; 
    Bar mybar = Bar(one, two, ""); 
    std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator); 
    if (ToFind != bars.end() && ToFind->one == mybar.one){ 
    result = ... 
    } 
    return result; 
} 

Die Methode Foo::Count sollte std::lower_bound() verwenden Element zu finden in vector<Bar> nach Paar von zwei Saiten. Nun der Teil, der nicht funktioniert. Zu lower_bound() Ich stelle Methode comparator() zur Verfügung. Ich dachte, es war in Ordnung, aber g ++ sagt:

c.cpp: In member function ‘int Foo::Count(const string&, const string&) const’: 
c.cpp:42:94: error: invalid use of non-static member function 
std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator); 

Und die Methode Count() muss bleiben const ...

Ich bin ganz neu in C++, weil ich gezwungen bin, es zu lernen.

Irgendwelche Ideen?

+0

Warum genau ist diese Funktion nicht statisch? – chris

+0

Welcher? Ich darf die Deklaration der Funktion Count() – Nash

Antwort

3

Sie müssen Foo::comparator statisch machen oder es in ein std::mem_fun Klassenobjekt umbrechen. Das liegt daran, dass lower_bounds erwartet, dass der Vergleich eine Klasse von Objekten ist, die einen Aufrufoperator haben, wie einen Funktionszeiger oder ein Funktorobjekt. Wenn Sie C++ 11 oder höher verwenden, können Sie auch die Funktion dwcanillas verwenden und eine Lambda-Funktion verwenden. C++ 11 hat auch std::bind zu.

Beispiele:

// Binding: 
std::lower_bounds(first, last, value, std::bind(&Foo::comparitor, this, _1, _2)); 
// Lambda: 
std::lower_bounds(first, last, value, [](const Bar & first, const Bar & second) { return ...; }); 
+1

nicht ändern oder eine Lambda-Funktion verwenden. – dwcanillas

+0

Okay, jetzt verstehe ich es. Vielen Dank! – Nash

+1

Gern geschehen. Ich würde den Fall machen, dass die Vergleichsfunktion statisch ist, da sie nicht auf die Klasse zugreift. –

0

Sie sollen einen this Zeiger übergeben Sie die Funktion zu erzählen, die auf arbeiten Objekt, weil es auf das verlässt sich wie auf einer static Memberfunktion gegenüber.

6

Die einfachste Lösung ist, um die Vergleichsfunktion statisch zu machen:

static int comparator (const Bar & first, const Bar & second); 
^^^^^^ 

Wenn es in Count Aufruf, wird der Name Foo::comparator sein.

Wie Sie es jetzt haben, ist es nicht sinnvoll, eine nicht statische Elementfunktion zu sein, da es keine Elementvariablen von Foo verwendet.

Eine weitere Option ist, es zu einer Nicht-Mitglied-Funktion zu machen, besonders wenn es Sinn macht, dass dieser Komparator von anderem Code außer nur Foo verwendet werden kann.

Verwandte Themen