将函数传递给类中的函数时数据类型不匹配

时间:2021-02-18 16:13:34

标签: c++ types

我正在尝试在带有 arduino 库的类中实现 websocket (https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSocketsClient.h) 在 esp8266s 上。
我没有使用 Arduino IDE,而是使用 Home-assistant 的 ESPHome 集成,这就是代码必须在类中的原因。

为了实现 websocket,我必须将一个函数传递给另一个函数,但显然数据类型不匹配,我不明白如何实现这一点。这是我的代码的缩短版本:
我的代码:

#include "esphome.h"
#include "WebSocketsClient.h"
#include <iostream>
#include <string.h>

class CustomWebsocket : public Component, public Sensor {
    public:
        WebSocketsClient webSocket;

        CustomWebsocket();
        void webSocketEventCustom(WStype_t type, uint8_t * payload, size_t length);
        void setup() override;
};

void CustomWebsocket::webSocketEventCustom(WStype_t type, uint8_t * payload, size_t length) {

    switch(type) {
        case WStype_DISCONNECTED:
            break;
        case WStype_CONNECTED: 
            break;
        case WStype_TEXT:
            //do stuff
            break;
    };
};

void CustomWebsocket::setup(){
    webSocket.begin("192.168.178.23", 81, "/");
    webSocket.onEvent(this->webSocketEventCustom);
};

最后一行是传递函数的地方。它导致此错误消息:
错误信息:

error: no matching function for call to 'WebSocketsClient::onEvent(<unresolved overloaded function type>)'
  webSocket.onEvent(this->webSocketEventCustom);
                                              ^
note: candidate is:
In file included from src/CustomWebsocket.h:2:0,
                 from src/main.cpp:43:
note: void WebSocketsClient::onEvent(WebSocketsClient::WebSocketClientEvent)
     void onEvent(WebSocketClientEvent cbEvent);
          ^
note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'WebSocketsClient::WebSocketClientEvent {aka std::function<void(WStype_t, unsigned char*, unsigned int)>}'

所需的数据类型“WebSocketClientEvent”在库的头文件中指定:
使用过的库:

class WebSocketsClient : protected WebSockets {
  public:
    typedef std::function<void(WStype_t type, uint8_t * payload, size_t length)> WebSocketClientEvent;
    void onEvent(WebSocketClientEvent cbEvent);

所以我的问题是如何以库要求的方式传递函数?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。显然,类的普通函数和成员函数之间存在差异,因此指向每个函数的指针也不同。更详细的解释:https://isocpp.org/wiki/faq/pointers-to-members
我现在已将函数及其内部使用的变量设置为静态,从而解决了问题。

相关问题