C++<未解析的重载函数类型>
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);
需要一个函数。您正在尝试向它传递一个成员函数。那是不可能的。
在旧代码中,您将看到传递函数指针和参数的方法,然后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();
}
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?