【问题标题】:Syntax error of a pointer to member function指向成员函数的指针的语法错误
【发布时间】:2013-04-30 11:07:19
【问题描述】:

问候 我正在尝试对特殊对象使用 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

我尝试了其他一些方法来让事情正常工作,但没有。

我没有绑定到成员函数的指针,如果你有一个简单/不同的方法来做这件事,欢迎你。

非常感谢,

阿兹瑞拉

【问题讨论】:

  • 它不起作用,因为this-&gt;*ptr 没有按照您的想法执行。它不会通过绑定this 创建常规函数指针。它甚至不是合法的语法。
  • 您需要一个函子对象,该对象包含对 B 对象的引用。

标签: c++ function pointers member


【解决方案1】:

你不能使用这样的东西,你应该使用std::bindboost::bindlambda,因为sort第三个参数应该是可调用对象,接收两个T类型的对象。

std::bind 会是

using namespace std::placeholders;
sort(list.begin(), list.end(), std::bind(ptr, this, _1, _2));

【讨论】:

  • 我不知道 std::bind,我想这正是我需要的。非常感谢。看来我需要更多地了解指向成员函数的指针:)。
【解决方案2】:

这一行:

bool (B::*ptr)(A*,A*) = &B::Closer;

获取指向成员函数 B 的点。要调用此函数,您需要一个类实例来调用它(成员函数需要知道它可以访问的类数据的具体实例等)。例如

(this->*ptr)(lhs, rhs)

调用this的成员函数。如果你这样做了

B anotherB;
bool (B::*ptr)(A*,A*) = &B::Closer;
(anotherB.*ptr)(lhs, rhs)

这将调用 B::Closer 函数,但这次使用 anotherB 而不是 this(假设 this 不是 'anotherB')

我不确定是什么...

 (this->*ptr)

...评估为?,但这是问题

我认为问题是你不能给 sort() 类实例和成员函数指针......你只能给它成员函数指针,所以它没有可以调用这个函数的类实例。

正如 ForEveR 建议的那样,您可以使用 std::bind 以便您可以从具有四个参数(hls、rhs、类实例、成员指针)的函数进行转换。将一个绑定到“this”,将一个绑定到所需的成员函数,这样结果就是只需要 lhs 和 rhs 的函数。

【讨论】:

  • 是的,感谢您的解释。正如 ForEveR 建议的那样,我使用了 bind,它工作得非常好:)
猜你喜欢
  • 2016-12-27
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多