我正在为ESP32(一种类似Arduino的芯片(编程。然而,为了更容易/更快地发现编译器错误/警告,并在以后的PC上进行某种虚拟化,我喜欢在PC上编译代码(使用Visual Studio(。
然而,我无法在PC上编译以下代码(当它在用于ESP32的Arduino IDE中编译时(:
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request)
{
request->send_P(200, "text/html", textBuffer, Processor);
});
我得到的错误是:
Severity Code Description Project File Line Suppression State
Error (active) E0413 no suitable conversion function from "lambda []void (AsyncWebServerRequest *request)->void" to "AsyncWebServerRequest *" exists RelayBox C:UsersmichesourcereposRelayBox2RelayBoxRelayBoxRelayBoxServer.cpp 203
Error C2664 'void AsyncWebServer::on(const char *,int,AsyncWebServerRequest *)': cannot convert argument 3 from 'RelayBoxServer::Send::<lambda_6ffcff35888ca3a1f1d7d541e1edeba3>' to 'AsyncWebServerRequest *' RelayBox C:UsersmichesourcereposRelayBox2RelayBoxRelayBoxRelayBoxServer.cpp 206
该代码基于位于的ESP32库https://github.com/me-no-dev/ESPAsyncWebServer/blob/master/src/ESPAsyncWebServer.h
我使用上面的库创建了"stub"类,但对我的项目进行了简化,使用了"…"作为无关代码:
class AsyncWebServer
{
...
void on(const char* something, int httpGet, AsyncWebServerRequest* function);
...
}
#define HTTP_GET 100
class AsyncWebServerRequest
{
public:
void send_P(int port, const char* textHmlt, STRING text, ProcessorHandlerFunction function);
};
class ArduinoStringStub : public std::string
{
...
}
如何使用lambda函数修复此方法中的参数类型转换编译器错误?
我已经检查了您的引用github,似乎源AsyncWebServer
类有这样的签名:
AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest);
而ArRequestHandlerFunction
实际上是:
typedef std::function<void(AsyncWebServerRequest *request)> ArRequestHandlerFunction;
因此,您创建的stub/mockAsyncWebServer
似乎不应该使用AsyncWebServerRequest*
,而是使用ArRequestHandlerFunction
作为on
方法的最后一个参数,与原始代码相对应。