跨类传递成员回调函数报错:'=': function as left operand 求助
问题根源
你遇到的编译错误'=': function as left operand,核心原因是类型不兼容:
NADC338类中的postUpdate是普通函数指针类型,只能指向无上下文的普通函数/静态成员函数;- 而
std::bind(&WebUiCoroutine::postHandler, this, ...)生成的是一个包含当前WebUiCoroutine对象指针(this)的可调用对象,它带有状态,无法直接赋值给普通函数指针。
解决方案:改用
std::function存储回调 最简洁且通用的修复方式是把NADC338中的函数指针替换为std::function,它可以兼容所有可调用对象(包括绑定了上下文的成员函数、lambda、普通函数等)。
步骤1:修改NADC338.h
#include <functional> #include <string> class NADC338 { // 无参构造设为私有(如果不需要外部调用) NADC338(); public: NADC338(std::string ip, int port); // 替换原函数指针为std::function std::function<void(crow::json::wvalue)> postUpdate; void register_callback(std::function<void(crow::json::wvalue)> callback); };
步骤2:NADC338.cpp无需修改
原register_callback的赋值逻辑直接生效:
void NADC338::register_callback(std::function<void(crow::json::wvalue)> callback) { postUpdate = callback; }
步骤3:修正WebUiCoroutine.h的细节问题
补充必要的头文件、参数名,修复类定义末尾的分号:
#include "NADC338.h" #include <crow/json.h> #include <functional> #include <placeholders> class WebUiCoroutine { // 给port赋值实际数值,比如8080 NADC338 nadAPI = NADC338("someIPAdress", 8080); public: WebUiCoroutine() { nadAPI.register_callback(std::bind(&WebUiCoroutine::postHandler, this, std::placeholders::_1)); } // 给参数添加名称,方便后续使用 void postHandler(crow::json::wvalue updateData) { // 调用WebUiCoroutine的其他成员方法 } };
可选方案:用静态成员函数做中间层(不推荐)
如果必须保留函数指针,需要通过静态成员函数中转,同时用全局/静态变量传递this指针,但这种方式耦合度高、易出错:
// WebUiCoroutine.h中添加静态成员函数和静态指针 class WebUiCoroutine { static WebUiCoroutine* instance; NADC338 nadAPI = NADC338("someIPAdress", 8080); public: WebUiCoroutine() { instance = this; nadAPI.register_callback(&WebUiCoroutine::staticPostHandler); } static void staticPostHandler(crow::json::wvalue data) { instance->postHandler(data); } void postHandler(crow::json::wvalue updateData) { // 原逻辑 } }; // WebUiCoroutine.cpp中初始化静态指针 WebUiCoroutine* WebUiCoroutine::instance = nullptr;
这种方式仅适用于单实例场景,远不如std::function方案灵活。
内容的提问来源于stack exchange,提问作者Rhaoama
相关产品推荐
相关产品推荐

