C++类内成员函数作sort参数报错:需用&创建成员指针,类外正常原因?
问题根源
这个报错的核心原因是类的非静态成员函数和普通全局函数的本质差异:
- 非静态成员函数会隐含一个
this指针参数(编译器自动添加),用来指向调用该函数的类对象实例。当你直接把sfun传给sort时,编译器没法确定这个this该绑定到哪个对象上,所以才会提示你用&取成员函数指针——但就算取了地址,非静态成员函数也不能脱离对象单独调用,还是得绑定具体实例才行。 - 而类外的普通函数没有这个隐藏的
this指针,是完全独立的可调用实体,刚好符合sort对比较函数的要求,所以编译器能正常处理。
解决办法
给你几个实用的解决方案,按需选择:
1. 将成员函数改为静态成员函数
静态成员函数没有隐含的this指针,和普通全局函数的调用逻辑类似,不需要绑定具体对象,直接就能传给sort:
class YourClass { public: // 改为静态成员函数 static bool sfun(const Interval& a, const Interval& b) { // 注意:静态函数无法访问类的非静态成员变量 return a.start < b.start; } void processIntervals() { vector<Interval> intervals; // 直接传递静态成员函数即可 sort(intervals.begin(), intervals.end(), YourClass::sfun); } };
2. 使用Lambda表达式(推荐,灵活度最高)
如果你的比较逻辑需要访问类的非静态成员变量,用Lambda表达式最方便——它可以捕获当前对象的this指针,在内部调用成员函数:
class YourClass { private: int someMember; // 非静态成员变量 public: bool sfun(const Interval& a, const Interval& b) { // 可以直接访问this->someMember return a.start + someMember < b.start + someMember; } void processIntervals() { vector<Interval> intervals; // 用Lambda捕获this,内部调用成员函数 sort(intervals.begin(), intervals.end(), [this](const Interval& a, const Interval& b) { return this->sfun(a, b); }); } };
3. 使用std::bind绑定对象实例
如果你一定要用非静态成员函数,也可以用std::bind把成员函数和具体对象实例绑定,生成一个可调用对象传给sort:
#include <functional> // 需要包含这个头文件 class YourClass { public: bool sfun(const Interval& a, const Interval& b) { return a.start < b.start; } void processIntervals() { vector<Interval> intervals; // 绑定当前对象的this和成员函数,占位符表示参数位置 auto boundFunc = std::bind(&YourClass::sfun, this, std::placeholders::_1, std::placeholders::_2); sort(intervals.begin(), intervals.end(), boundFunc); } };
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

