C++<未解析的重载函数类型>

c++ <unresolved overloaded function type>

本文关键字:重载 函数 类型 gt lt C++      更新时间:2023-10-16

我是c++新手。我正试图将现有的和功能的c风格代码转换为c++。它是用于arduino内核的ESP8266WebServer。它使用ESP8266WebServer,这是一个c++类。我试图创建一个类,其中包括上述类作为对象。但是,下面的代码会生成下面列出的错误。我知道我可以只使用IDE附带的示例代码,但这样我就不会学到太多东西。如有任何帮助,不胜感激。

    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <ESP8266mDNS.h>
    class myServer {
        public:
          const char* ssid="mySSID";
          const char* pass="myPASS";
          myServer(int n);
          void start();
          void handlers();
          void sayHello();
        private:
          ESP8266WebServer serv;
      };
    myServer::myServer(int n){ 
      ESP8266WebServer serv(n);  
    }
    void myServer::start(){
      WiFi.begin(ssid, pass);  
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    }
    void myServer::sayHello() {serv.send(200, "text/plain", "hello from esp8266!");}
    void myServer::handlers(){
        if (MDNS.begin("esp8266")) {Serial.println("MDNS responder started");}
        serv.on("/", sayHello);
        //on("/inline", [](){send(200, "text/plain", "this works as well");});
        //onNotFound();
        serv.begin();
    }
    //----------------------
    myServer server(80);
    void setup(){
      server.start();
      server.handlers();
    }
    void loop() {
      //server.handleClient(); //goes in to loop
    }

我得到以下错误:

    /home/mrpong/Arduino/myserver/myserver.ino: In member function 'void myServer::handlers()':
    myserver:34: error: no matching function for call to 'ESP8266WebServer::on(const char [2], <unresolved overloaded function type>)'
         serv.on("/", sayHello);
                              ^
    /home/mrpong/Arduino/myserver/myserver.ino:34:26: note: candidates are:
    In file included from /home/mrpong/Arduino/myserver/myserver.ino:3:0:
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:79:8: note: void ESP8266WebServer::on(const char*, ESP8266WebServer::THandlerFunction)
       void on(const char* uri, THandlerFunction handler);
            ^
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:79:8: note:   no known conversion for argument 2 from '<unresolved overloaded function type>' to 'ESP8266WebServer::THandlerFunction {aka std::function<void()>}'
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:80:8: note: void ESP8266WebServer::on(const char*, HTTPMethod, ESP8266WebServer::THandlerFunction)
       void on(const char* uri, HTTPMethod method, THandlerFunction fn);
            ^
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:80:8: note:   candidate expects 3 arguments, 2 provided
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:81:8: note: void ESP8266WebServer::on(const char*, HTTPMethod, ESP8266WebServer::THandlerFunction, ESP8266WebServer::THandlerFunction)
       void on(const char* uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn);
            ^
    /home/mrpong/.arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:81:8: note:   candidate expects 4 arguments, 2 provided
    exit status 1
    no matching function for call to 'ESP8266WebServer::on(const char [2], <unresolved overloaded function type>)'

非常感谢任何帮助。由于

void f();
struct A { void m(); };

f是一个函数,但是没有m,取而代之的是A::m,这是一个成员函数,需要调用A的实例。从A内部,我们可以将其称为m,但不要被愚弄了。

ESP8266Webserver::on的声明如下:

typedef std::function<void(void)> THandlerFunction;
void on(const String &uri, THandlerFunction handler);

需要一个函数。您正在尝试向它传递一个成员函数。那是不可能的。

在旧代码中,您将看到传递函数指针和参数的方法,然后trampoline是将两者组合在一起的静态函数:

static void trampoline(myServer* ptr)
{
     ptr->sayHello();
}
void myServer::handlers(){
     //...
     on("/", trampoline, this);
}

在你的代码中的问题行之后有一个lambda的例子:

//on("/inline", [](){send(200, "text/plain", "this works as well");});

on定义使用std::function,因为这允许使用捕获lambda作为这样的参数,让我们可以做任何我们想做的事情,只要它不接受任何参数或返回任何东西。

从上面的struct A的成员函数内部,编写m();在编译器看来就像this->m();。我们使用lambda来创建所谓的trampoline:

void myServer::handlers(){
    if (MDNS.begin("esp8266")) {Serial.println("MDNS responder started");}
    serv.on("/", [this](){ sayHello(); });
    serv.on("/inline", [](){send(200, "text/plain", "this works as well");});
    //onNotFound();
    serv.begin();
}