wake-up-neo.com

ungültige Verwendung der nicht statischen Mitgliedsfunktion

Ich habe so etwas:

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, um ein Element in vector<Bar> Gemäß einem Paar von zwei Zeichenfolgen zu finden. Nun der Teil, der nicht funktioniert. Für lower_bound() stelle ich die Methode comparator() bereit. Ich fand es okay, 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 const bleiben ...

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

Irgendwelche Ideen?

18
Nash

Sie müssen Foo::comparator Statisch machen oder es in ein Klassenobjekt std::mem_fun Einschließen. Dies liegt daran, dass lower_bounds erwartet, dass der Komparator eine Objektklasse ist, die einen Aufrufoperator hat, z. B. einen Funktionszeiger oder ein Funktionsobjekt. Wenn Sie C++ 11 oder höher verwenden, können Sie auch Folgendes tun: dwcanillas schlägt eine Lambda-Funktion vor und verwendet sie. C++ 11 hat auch std::bind.

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 ...; });
8
Matthew

Die einfachste Lösung besteht darin, die Komparatorfunktion statisch zu machen:

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

Beim Aufrufen in Count lautet der Name Foo::comparator.

So wie Sie es jetzt haben, ist es nicht sinnvoll, eine nicht statische Member-Funktion zu sein, da keine Member-Variablen von Foo verwendet werden.

Eine andere Möglichkeit besteht darin, es zu einer Nicht-Member-Funktion zu machen, insbesondere wenn es sinnvoll ist, dass dieser Komparator von anderem Code als nur Foo verwendet wird.

16
M.M

Sie müssen einen Zeiger this übergeben, um der Funktion mitzuteilen, an welchem ​​Objekt sie arbeiten soll, da sie sich auf dieses Objekt im Gegensatz zu einer Member-Funktion static stützt.

2
edmz