2015-03-26 54 views
6

ho qualcosa di simile:uso non valida di funzione membro non statica

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; 
} 

Il metodo Foo::Count dovrebbe usare std::lower_bound() per trovare elemento vector<Bar> in base alla coppia di due stringhe. Ora la parte che non funziona. Per lower_bound() sto fornendo il metodo comparator(). Ho pensato che era okay, ma g ++ dice:

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); 

E il metodo Count() deve rimanere const ...

Sono abbastanza nuovo per C++, perché sono costretto a imparare.

Qualche idea?

+0

Perché esattamente non è quella funzione statica? – chris

+0

Quale? Non sono autorizzato a modificare la dichiarazione della funzione Conteggio() – Nash

risposta

3

È necessario effettuare il Foo::comparator statico o avvolgerlo in un oggetto di classe std::mem_fun. Questo perché lower_bounds si aspetta che il comparatore sia una classe di oggetti che ha un operatore di chiamata, come un puntatore a funzione o un oggetto functor. Inoltre, se stai usando C++ 11 o versioni successive, puoi anche fare come suggerisce dwcanillas e utilizzare una funzione lambda. Anche C++ 11 ha std::bind.

Esempi:

// 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

Oppure utilizzare una funzione lambda. – dwcanillas

+0

Ok, ora capisco. Grazie mille! – Nash

+1

Prego. Vorrei fare il caso che la funzione di confronto sia statica anche se non accede alla classe. –

0

Si devono passare un puntatore this a dire la funzione di quale oggetto di lavorare su perché si basa su che al contrario di una funzione static membro.

6

La correzione più semplice è quello di rendere la funzione comparatore essere statico:

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

Quando si richiama in Count, il suo nome sarà Foo::comparator.

In questo modo, non ha senso essere una funzione membro non statico perché non utilizza alcuna variabile membro di .

Un'altra opzione è renderla una funzione non membro, soprattutto se ha senso che questo comparatore possa essere utilizzato da altro codice oltre a Foo.