非静态成员函数的无效使用
invalid use of non-static member function
我有这样的东西:
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++ 很陌生,因为我被迫学习它。
有什么想法吗?
您必须将 Foo::comparator
设为静态或将其包装在 std::mem_fun
class 对象中。这是因为 lower_bounds()
期望比较器是 class 具有调用运算符的对象,如函数指针或仿函数对象。此外,如果您使用的是 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 ...; });
您应该传递一个 this
指针来告诉函数要处理哪个对象,因为它依赖于该对象而不是 static
成员函数。
最简单的修复方法是使比较器函数成为静态的:
static int comparator (const Bar & first, const Bar & second);
^^^^^^
在Count
中调用它时,它的名称将是Foo::comparator
。
按照你现在的方式,作为一个非静态成员函数是没有意义的,因为它不使用Foo
.
的任何成员变量
另一种选择是使其成为非成员函数,特别是如果除了 Foo
.
之外,其他代码也可能使用此比较器是有意义的。
我有这样的东西:
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++ 很陌生,因为我被迫学习它。
有什么想法吗?
您必须将 Foo::comparator
设为静态或将其包装在 std::mem_fun
class 对象中。这是因为 lower_bounds()
期望比较器是 class 具有调用运算符的对象,如函数指针或仿函数对象。此外,如果您使用的是 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 ...; });
您应该传递一个 this
指针来告诉函数要处理哪个对象,因为它依赖于该对象而不是 static
成员函数。
最简单的修复方法是使比较器函数成为静态的:
static int comparator (const Bar & first, const Bar & second);
^^^^^^
在Count
中调用它时,它的名称将是Foo::comparator
。
按照你现在的方式,作为一个非静态成员函数是没有意义的,因为它不使用Foo
.
另一种选择是使其成为非成员函数,特别是如果除了 Foo
.