2016-10-01 24 views
1

私はC++を初めて使用しています。私は既存の機能しているCスタイルのコードをC++に変換しようとしています。 arduinoコア用のESP8266WebServerです。これは、C++クラスであるESP8266WebServerを使用します。私は上記のクラスをオブジェクトとして含むクラスを作成しようとしています。ただし、次のコードは、次のエラーを生成します。私は、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>)' 

大変助かりました。代わりに、メンバ関数は、Aのインスタンスに対して呼び出されるを必要とすることであるA::mあり、

おかげ

答えて

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

f関数であるが、はないmあります。 Aの内部からは、それをちょうどmと呼ぶことができますが、だまされることはありません。

ESP8266Webserver::onは、このように宣言されています:

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

それは機能が必要です。あなたはそれをのメンバー関数に渡そうとしています。それは可能ではありません。

あなたは関数ポインタと引数を渡すのアプローチを参照してくださいよ、その後、トランポリンが2を組み合わせた静的関数である古いコードで

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

関連する問題