You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++传递类成员函数作为函数指针时出现编译错误如何解决?

错误原因

非静态类成员函数的调用隐含依赖this指针,和你定义的print_array_of_length5接收的普通函数指针int (*)(int)类型完全不兼容。你尝试传入的smpl.*p只是成员函数和对象的绑定表达,不能直接转换为普通函数指针,所以触发编译报错。

可用修复方案

方案1:C++11及以上用std::function + std::bind适配(推荐)

这种方案不需要修改原有调用逻辑,兼容性最好。

  1. 首先引入对应头文件:
#include <functional>
  1. 修改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));
}
  1. 调用时绑定对象和成员函数:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:36:04