0

我正在尝试使用 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:完整的类似代码在这里

4

0 回答 0