我正在尝试使用 Qtcreator 编译此代码:
uWS::App().ws<PerSocketData>("/*", {
/* Settings */
.compression = uWS::DEDICATED_COMPRESSOR_3KB,
.maxPayloadLength = 16 * 1024 * 1024,
.idleTimeout = 10,
.maxBackpressure = 1 * 1024 * 1024,
/* Handlers */
.upgrade = nullptr,
.open = [](auto *ws) {
/* Let's make every connection subscribe to the "broadcast" topic */
ws->subscribe("broadcast");
},
.message = [](auto *ws, std::string_view message, uWS::OpCode opCode) {
/* Exit gracefully if we get a closedown message (ASAN debug) */
if (message == "closedown") {
/* Bye bye */
us_listen_socket_close(0, global_listen_socket);
ws->close();
}
/* Simply broadcast every single message we get */
ws->publish("broadcast", message, opCode, true);
},
.drain = [](auto */*ws*/) {
/* Check getBufferedAmount here */
},
.ping = [](auto */*ws*/, std::string_view) {
},
.pong = [](auto */*ws*/, std::string_view) {
},
.close = [](auto */*ws*/, int /*code*/, std::string_view /*message*/) {
/* We automatically unsubscribe from any topic here */
}
}).listen(9001, [](auto *listen_socket) {
global_listen_socket = listen_socket;
if (listen_socket) {
std::cout << "Listening on port " << 9001 << std::endl;
}
}).run();
并得到这个错误:
cannot convert '<brace-enclosed initializer list>' to 'uWS::TemplatedApp<false>::WebSocketBehaviormanagement::Websocket::Runner()::PerSocketData.
但是我在命令行中使用相同的编译器(arm-poky-linux-gnueabi-g++)成功编译了相同的代码。怎么了?无论如何,我将我的代码更改为此,它也在 Qtcreator 中编译得很好。
uWS::TemplatedApp<false>::WebSocketBehavior<PerSocketData> wsb = {
/* Settings */
.compression = uWS::SHARED_COMPRESSOR,
.maxPayloadLength = 16 * 1024,
.idleTimeout = 10,
.maxBackpressure = 1 * 1024 * 1024,
/* Handlers */
.upgrade = nullptr,
.open = [=](auto* ws) {
//std::cout << "connected" << std::endl;
is_there_stream = true;
//g_ws = ws;
},
.message = [](auto* ws, std::string_view message, uWS::OpCode opCode) {
//ws->send(message, opCode, true);
std::cout << message << std::endl;
},
.drain = [](auto*/*ws*/) {
/* Check ws->getBufferedAmount() here */
},
// .ping = [](auto*/*ws*/) {
// /* Not implemented yet */
// },
// .pong = [](auto*/*ws*/) {
// /* Not implemented yet */
// },
.close = [=](auto*/*ws*/, int /*code*/, std::string_view /*message*/) {
/* You may access ws->getUserData() here */
is_there_stream = false;
}
};
uWS::App().ws<PerSocketData>("/*", std::move(wsb)).get("/restart", [](auto* res, auto* req) {
//protocol->Restart();
}).listen(PORT, [](auto* listen_socket) {
if (listen_socket) {
std::cout << "Listening on port " << PORT << std::endl;
}
}).run();
现在编译没有问题,但我不知道发生了什么。加上 Qtcreator 从我评论它们的行中获取错误(ping/pong)。
error: could not convert '<lambda closure object>management::Websocket::Runner()::<lambda(auto:14*)>{}' from 'management::Websocket::Runner()::<lambda(auto:14*)>' to 'uWS::MoveOnlyFunction<void(uWS::WebSocket<false, true, management::Websocket::Runner()::PerSocketData>*, std::basic_string_view<char>)>' {aka 'ofats::any_invocable<void(uWS::WebSocket<false, true, management::Websocket::Runner()::PerSocketData>*, std::basic_string_view<char>)>'}
虽然有类似的代码(漏)。
为什么同一个编译器会显示这些不同的行为?请帮助我理解这一点。
PS:完整的类似代码在这里。