指向成员函数的指针的语法错误

Syntax error of a pointer to member function

本文关键字:指针 错误 语法 函数 成员      更新时间:2023-10-16

问候语我正在尝试对特殊对象使用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::bindboost::bindlambda,因为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的函数。