无效使用非静态成员函数

Nas*_*ash 19 c++ const function member non-static

我有这样的事情:

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;
}
Run Code Online (Sandbox Code Playgroud)

该方法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);
Run Code Online (Sandbox Code Playgroud)

而且方法Count()必须保持const......

我对C++很陌生,因为我不得不学习它.

有任何想法吗?

M.M*_*M.M 16

最简单的解决方法是使比较器功能为静态:

static int comparator (const Bar & first, const Bar & second);
^^^^^^
Run Code Online (Sandbox Code Playgroud)

在调用它时Count,它的名字将是Foo::comparator.

你现在拥有它的方式,成为一个非静态成员函数是没有意义的,因为它不使用任何成员变量Foo.

另一个选择是使它成为非成员函数,特别是如果有意义的话,这个比较器可能会被其他代码使用Foo.


Mat*_*hew 8

您必须创建Foo::comparator静态或将其包装在std::mem_fun类对象中.这是因为lower_bounds要求比较器是一个具有调用操作符的对象类,如函数指针或函子对象.此外,如果您使用的是C++ 11或更高版本,您也可以像dwcanillas建议的那样使用lambda函数.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 ...; });
Run Code Online (Sandbox Code Playgroud)


edm*_*dmz 7

您应该传递一个this指针来告诉函数要处理哪个对象,因为它依赖于该对象而不是static成员函数。