2016-10-01 4 views
1

Я новичок в C++. Я пытаюсь преобразовать существующий и действующий код стиля c в C++. Это ESP8266WebServer для ядра arduino. Он использует ESP8266WebServer, который является классом C++. Я пытаюсь создать класс, который включает указанный выше класс в качестве объекта. Однако следующий код генерирует ошибку, указанную ниже. Я знаю, что могу просто использовать пример кода, который пришел с IDE, но тогда я не буду многому учиться. Любая помощь очень ценится.C++ <неразрешенный перегруженный тип функции>

#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>)' 

Любая помощь очень ценится. Благодаря

ответ

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

f является функция, но это не m, вместо этого есть A::m, которая является функцией члена, требует экземпляра A будет вызываться против. Изнутри A мы можем ссылаться на него как на m, но не обманывайтесь.

The ESP8266Webserver::on объявляется следующим образом:

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

это требует функцию. Вы пытаетесь передать ему функцию . Это невозможно.

В старшем коде вы увидите подход, при котором вы передаете указатель на функцию и аргумент, а затем батут статическая функция, которая сочетает в себе два:

static void trampoline(myServer* ptr) 
{ 
    ptr->sayHello(); 
} 

void myServer::handlers(){ 
    //... 
    on("/", trampoline, this); 
} 

После вашей проблемы строку в коде есть пример лямбда:

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

on определение использует std::function, потому что это позволяет использовать захват лямбды в качестве аргумента, как это, позволяя нам делать почти все, что мы хотим, пока он не принимать любые аргументы или возвращать что-либо.

Изнутри функции-члена моего struct A выше, написание m(); выглядит в компиляторе как this->m();. Используя лямбда, мы используем это для создания так называемого батута:

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(); 
} 
+0

Как я уже говорил, я новичок. Это заняло несколько чтений, но медленно я понимаю это. Спасибо за четкий ответ и примеры. – user2530027

Смежные вопросы