拜 我正在尝试在特殊对象上使用std :: sort算法。 我有一个排序列表和一个二进制函数,它给我一个比较:
B.cpp的有趣部分
void B::FindClosest(vector<A*> list)
{
bool (B::*ptr)(A*,A*) = &B::Closer;
sort(list.begin(),list.end(),(this->*ptr));
// some use of this sorted list
}
bool B::Closer(A* lhs ,A* rhs)
{
if(Distance(this,lhs)<Distance(this,rhs))
{
return true;
}
else
{
return false;
}
}
和B.h:
class B : public A
public:
void FindClosest(vector<A*>);
bool Closer(A*,A*);
这看起来很简单,但我无法弄清楚为什么它不起作用。 在我看来,我在指向成员函数的指针上做错了什么但是无法找到什么。
这是错误消息:
agglomerate.cpp:32: error: invalid use of non-static member function
我已经尝试了其他一些方法让事情无效。
我没有指向成员函数的指针,如果你有一个简单/不同的方法来做这件事,欢迎你。
非常感谢,
Azhrilla
答案 0 :(得分:3)
你不能使用这种东西,在这种情况下你应该使用std::bind
或boost::bind
或lambda
,因为sort
第三个参数应该是可调用对象,它接收两个对象类型为T
。
std::bind
将是
using namespace std::placeholders;
sort(list.begin(), list.end(), std::bind(ptr, this, _1, _2));
答案 1 :(得分:0)
这一行:
bool (B::*ptr)(A*,A*) = &B::Closer;
获取成员函数B的一个点。要调用此函数,您需要一个类实例来调用它(成员函数需要知道它可以访问的类数据的哪个conrete实例等)。例如
(this->*ptr)(lhs, rhs)
调用此成员函数。如果你做了
B anotherB;
bool (B::*ptr)(A*,A*) = &B::Closer;
(anotherB.*ptr)(lhs, rhs)
那会调用B :: Closer函数,但这次使用的是AnotherB而不是这个(假设这不是'anotherB')
我不确定是什么......
(this->*ptr)
...评估为?,但这是问题
我认为问题在于你不能给sort()类实例和成员函数指针...你只能给它成员函数指针,所以它没有可以调用这个函数的类实例。 / p>
正如ForEveR建议的那样,你可以使用std :: bind,这样就可以转换一个带有参数的函数,hls,rhs,class-instance,member-pointer。将一个绑定到'this',将一个绑定到所需的成员函数,这样结果就是一个只需要lhs和rhs的函数。