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

C++ 指向成员函数的指针的语法错误,c++,function,pointers,member,C++,Function,Pointers,Member,问候 我试图在specials对象上使用std::sort算法。 我得到了一个要排序的列表和一个二进制函数,它给了我一个比较: B.cpp的有趣部分 void B::FindClosest(vector<A*> list) { bool (B::*ptr)(A*,A*) = &B::Closer; sort(list.begin(),list.end(),(this->*ptr));

问候 我试图在specials对象上使用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;
       }
     }
我试过其他方法让事情顺利进行,但什么都没有

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

非常感谢


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));

您不能使用这样的东西,对于这种情况,您应该使用
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,而不是这个(假设这不是“另一个B”)

我不确定是什么

 (this->*ptr)
…评估为?,但这是问题所在

我认为问题在于不能给sort()类实例和成员函数指针。。。您只能给它成员函数指针,因此它没有可调用此函数的类实例

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

此行:

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,而不是这个(假设这不是“另一个B”)

我不确定是什么

 (this->*ptr)
…评估为?,但这是问题所在

我认为问题在于不能给sort()类实例和成员函数指针。。。您只能给它成员函数指针,因此它没有可调用此函数的类实例


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

它不起作用,因为
这个->*ptr
没有做你认为它做的事情。它不会通过绑定
this
来创建常规函数指针。它甚至不是合法的语法。你需要一个包含对
B
对象引用的函子对象。它不起作用,因为
这个->*ptr
没有你想象的功能。它不会通过绑定
this
来创建常规函数指针。它甚至不是合法的语法。你需要一个函子对象来保存对
B
对象的引用。我不知道std::bind,我想这正是我需要的。谢谢。似乎我需要更多地了解指向成员函数的指针:)。我不知道std::bind,我想这正是我需要的。谢谢。看来我需要学习更多关于成员函数指针的知识:)。是的,谢谢你的解释。正如ForEveR建议的那样,我使用了bind,它工作得非常好:)是的,谢谢你的解释。正如ForEveR建议的那样,我使用了bind,它工作得非常好:)