指向成员函数的指针的语法错误
Syntax error of a pointer to member function
问候语我正在尝试对特殊对象使用std::排序算法。我有一个列表要排序,还有一个二进制函数,它给了我一个比较:
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
您不能使用这样的东西,在这种情况下,您应该使用std::bind
、boost::bind
或lambda
,因为sort
第三个参数应该是可调用对象,它接收两个类型为T
的对象。
有了std::bind
,它将是
using namespace std::placeholders;
sort(list.begin(), list.end(), std::bind(ptr, this, _1, _2));
此行:
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函数,但这次使用另一个B而不是这个(假设这不是"另一个"(
我不确定是什么。。。
(this->*ptr)
评估为?,但这是的问题
我认为问题是你不能给sort((类实例和成员函数指针。。。您只能为它提供成员函数指针,因此它没有可调用此函数的类实例。
正如ForEveR所建议的,您可以使用std::bind,这样您就可以从一个有四个参数的函数转换,hls、rhs、类实例和成员指针。将一个绑定到"this",将一个绑到所需的成员函数,这样得到的结果就是一个只需要lhs和rhs的函数。
相关文章:
- 为什么我在空指针错误(链表)中获取成员访问权限
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 为什么我得到 munmap_chunk():无效的指针:错误
- 成员模板函数指针错误
- 删除指针时,未分配被释放的 C++ 指针错误
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- C++数组指针错误无法将“int*”转换为“int**”
- C++ 通过函数指针错误调用成员函数
- 从 BST 中删除元素(指针错误)
- 随机生成的多维布尔指针错误
- 在测试中使用unique_ptr时指针错误无效
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 抽象类和唯一指针 c++ 错误
- 返回函数指针错误而不带类型定义
- 练习中出现空指针错误
- 指针错误导致的分段错误(简单..)
- free():C++中的指针错误无效
- 使用布尔值数组"表达式必须具有指向对象类型的指针"错误C++
- 指针错误的C 数组