在类中引用函数时出现“调用没有匹配函数”

Posted

技术标签:

【中文标题】在类中引用函数时出现“调用没有匹配函数”【英文标题】:"No Matching Function for Call" when referencing function in class 【发布时间】:2017-11-20 12:33:09 【问题描述】:

我正在尝试让 ESP8266 WebSocketsServer 实例与调度程序一起使用,但我无法使用 onEvent 函数对其进行编译。在设置中,我正在调用

webSocket.onEvent(std::bind(&WebServer::webSocketEvent, this));

WebServer是类,webSocketEvent定义为

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) ...

这是完整的编译错误日志:

sketch_nov20a.ino: In member function 'virtual void WebServer::setup()':

sketch_nov20a:25: error: no matching function for call to 'WebSocketsServer::onEvent(std::_Bind_helper<false, void (WebServer::*)(unsigned char, WStype_t, unsigned char*, unsigned int), WebServer* const>::type)'

       webSocket.onEvent(std::bind(&WebServer::webSocketEvent, this));

                                                                    ^

sketch_nov20a.ino:25:68: note: candidate is:

In file included from sketch_nov20a.ino:3:0:

...\Arduino\libraries\WebSockets\src/WebSocketsServer.h:58:14: note: void WebSocketsServer::onEvent(WebSocketsServer::WebSocketServerEvent)

         void onEvent(WebSocketServerEvent cbEvent);

              ^

...\Arduino\libraries\WebSockets\src/WebSocketsServer.h:58:14: note:   no known conversion for argument 1 from 'std::_Bind_helper<false, void (WebServer::*)(unsigned char, WStype_t, unsigned char*, unsigned int), WebServer* const>::type aka std::_Bind<std::_Mem_fn<void (WebServer::*)(unsigned char, WStype_t, unsigned char*, unsigned int)>(WebServer*)>' to 'WebSocketsServer::WebSocketServerEvent aka std::function<void(unsigned char, WStype_t, unsigned char*, unsigned int)>'

你知道我做错了什么吗?

【问题讨论】:

请善待并张贴minimal reproducible example。貌似onEvent不接受std::bind的结果,但是不看相关代码很难知道。 尝试构造 std::function 并传递它...? std::function func = std::bind(...); webSocket.onEvent(func);隐式转换应该可以工作,但是显式构造可能会在错误消息中为您提供一些额外的信息。 【参考方案1】:

std::bind() 需要明确地被告知将参数从它的助手被调用到原始函数时传递。根据函数中参数的数量,可能需要更多或更少的占位符。

要解决这个问题,调用需要从

webSocket.onEvent(std::bind(&WebServer::webSocketEvent, this));

webSocket.onEvent(std::bind(&WebServer::webSocketEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));

【讨论】:

以上是关于在类中引用函数时出现“调用没有匹配函数”的主要内容,如果未能解决你的问题,请参考以下文章

用另一个函数(都在类中)调用函数时出现问题。没有错误代码 C++

在类中使用自定义排序时出现编译错误 [重复]

Qt 插槽,调用没有匹配函数

在类中滚动 UIScrollBar 组件时出现问题

尝试在类构造函数中初始化 std::thread 时出现编译器错误 C2064 [重复]

3.课上练习