Недопустимое использование нестатической функции-члена
У меня есть что-то вроде этого:
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
функция-член.