C++传递类成员函数作为函数指针时出现编译错误如何解决?
错误原因
非静态类成员函数的调用隐含依赖this指针,和你定义的print_array_of_length5接收的普通函数指针int (*)(int)类型完全不兼容。你尝试传入的smpl.*p只是成员函数和对象的绑定表达,不能直接转换为普通函数指针,所以触发编译报错。
可用修复方案
方案1:C++11及以上用std::function + std::bind适配(推荐)
这种方案不需要修改原有调用逻辑,兼容性最好。
- 首先引入对应头文件:
#include <functional>
- 修改
print_array_of_length5的参数类型,接收通用可调用对象:
void print_array_of_length5(std::function<int(int)> fnptr){ for (int i = 0; i < 5; i++) printf("%d ", fnptr(i)); }
- 调用时绑定对象和成员函数:
int main(){ print_array_of_length5(&global_function);// 原有调用不受影响 class SIMPLE smpl; print_array_of_length5(std::bind(&SIMPLE::retval, &smpl, std::placeholders::_1)); return 0; }
方案2:新增全局包装函数适配原有接口
如果你不能修改print_array_of_length5的定义,可以用全局变量暂存对象实例,写一层包装函数转换类型:
// 新增全局变量和包装函数 SIMPLE* g_smpl_instance = nullptr; int smpl_retval_wrapper(int index){ return g_smpl_instance->retval(index); } int main(){ print_array_of_length5(&global_function);//Works fine. class SIMPLE smpl; g_smpl_instance = &smpl; print_array_of_length5(&smpl_retval_wrapper); return 0; }
方案3:将成员函数改为静态(仅适用于不需要访问类非静态成员的场景)
如果你的retval函数不需要访问类的非静态成员val,可以将其声明为静态成员函数,静态成员函数没有隐含this指针,可以直接转换为普通函数指针。但你当前的场景需要访问成员数组val,所以该方案不适用。
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

