[英]c++ <unresolved overloaded function type>
我是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);
它需要一个功能 。 您试图将其传递给成员函数 。 那不可能
在较早的代码中,您将看到一种传递函数指针和参数的方法,然后蹦床是将两者结合在一起的静态函数:
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,我们使用它来创建所谓的蹦床:
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.