编译代码时不同的 qtcreator 行为

问题描述

我正在尝试使用 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*/,.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,/* Handlers */
            .upgrade = nullptr,.open = [=](auto* ws) {
                //std::cout << "connected" << std::endl;
                is_there_stream = true;
                //g_ws = ws;
            },.message = [](auto* ws,uWS::OpCode opCode) {
                //ws->send(message,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*/,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 从我评论的行中得到错误(乒乓/乒乓)。

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,std::basic_string_view<char>)>'}

虽然有类似这样的代码(drain)。

为什么同一个编译器会显示这些不同的行为? 请帮助我理解这一点。

PS:完全相似的代码here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)