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

C++非Lambda方式传递类成员方法作为参数遇编译错误求助

解决成员函数作为参数传递的编译错误

错误原因

核心问题是类成员函数与普通函数的本质区别:成员函数隐含一个this指针作为第一个参数,因此无法直接将成员函数名当作普通函数指针传递给std::function或包装器。编译器提示的use '&' to create pointer to member是在提醒你需要显式获取成员函数的地址,但仅仅取地址还不够——你还需要绑定当前类的实例(this指针),才能让成员函数变成符合std::function签名的可调用对象。

解决方案

方法1:使用Lambda绑定this(推荐)

Lambda是最直观的方式,直接在构造函数中绑定当前实例的this,将成员函数包装成符合要求的可调用对象:

修改MyClass.cpp的构造函数:

#include <functional> // 确保包含此头文件

MyClass::MyClass(){
    // 绑定Computing成员函数到当前实例
    auto boundComputing = [this](std::function<void(int)> callback) {
        this->Computing(callback);
    };
    std::function<void(std::function<void(int)>)> question = TheWrapper(boundComputing);

    // 绑定Answering成员函数到当前实例
    auto boundAnswering = [this](int i) {
        this->Answering(i);
    };
    question(boundAnswering);
}

方法2:使用std::bind绑定实例和成员函数

如果你更习惯使用std::bind,可以显式绑定this和成员函数地址:

#include <functional>

MyClass::MyClass(){
    // 绑定Computing:第一个参数是成员函数地址,第二个是当前实例,_1表示占位符接收callback参数
    auto boundComputing = std::bind(&MyClass::Computing, this, std::placeholders::_1);
    std::function<void(std::function<void(int)>)> question = TheWrapper(boundComputing);

    // 绑定Answering:同理绑定this和成员函数地址
    auto boundAnswering = std::bind(&MyClass::Answering, this, std::placeholders::_1);
    question(boundAnswering);
}

额外注意事项

  • 确保所有使用std::function、std::bind的文件都包含<functional>头文件,否则会出现未定义的符号错误。
  • 成员函数的地址必须显式用&获取(比如&MyClass::Computing),不能直接写Computing,这是C++对成员函数指针的语法要求。

内容的提问来源于stack exchange,提问作者Reahreic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:20