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
相关产品推荐
相关产品推荐

