Недопустимое использование нестатической функции-члена

У меня есть что-то вроде этого:

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

Метод Foo::Count следует использовать std::lower_bound() найти элемент в vector<Bar> согласно паре двух струн. Теперь часть, которая не работает. к lower_bound() Я предоставляю метод comparator(), Я думал, что все в порядке, но G ++ говорит:

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

И метод Count() должен остаться const...

Я довольно плохо знаком с C++, потому что вынужден изучать его.

Есть идеи?

3 ответа

Решение

Вы должны сделать Foo::comparator статично или завернуть в std::mem_fun объект класса. Это потому, что lower_bounds ожидает, что компаратор будет классом объекта, у которого есть оператор вызова, например указатель функции или объект функтора. Кроме того, если вы используете C++11 или более dwcanillas, вы также можете делать то, что предлагает dwcanillas, и использовать лямбда-функцию. C++11 также имеет std::bind тоже.

Примеры:

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

Самое простое решение - сделать функцию компаратора статической:

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

При вызове его в Count, его имя будет Foo::comparator,

То, как вы это делаете сейчас, не имеет смысла быть нестатической функцией-членом, потому что она не использует переменные-члены Foo,

Другой вариант - сделать его функцией, не являющейся членом, особенно если имеет смысл, что этот компаратор может использоваться другим кодом, кроме просто Foo,

Вы должны пройти this указатель, чтобы сообщить функции, над каким объектом работать, потому что он полагается на это, а не на static функция-член.

Другие вопросы по тегам