ошибка: передача 'const string {aka const std :: basic_string <char>}' в качестве аргумента "this" из ... отбрасывает квалификаторы [-fpermissive] - PullRequest
0 голосов
/ 30 марта 2020


Я пытаюсь реализовать клиент Websocket с использованием Cpprest SDK (Касабланка). Я успешно установил соединение через Web Socket и могу отправлять / получать сообщения. Ответ получен как экземпляр websocket_incoming_message, у которого есть метод extract_string (), определение которого

_ASYNCRTIMP pplx::task<std::string> web::websockets::client::websocket_incoming_message::extract_string (       )   const

Следовательно, он возвращает константную строку.

Я пытаюсь назначить это строка в переменную локальной строки функции, чтобы я мог вернуть ее вызывающему методу. Тем не менее, я получаю следующую ошибку,

error: passing ‘const string {aka const std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ discards qualifiers [-fpermissive]

Ниже мой блок кода,

   std::string WebSocketUtility::send_command(const char* command){

    websocket_outgoing_message o_msg;
     std::string ws_response;

    o_msg.set_utf8_message(command);
    client->send(o_msg).then([](){
        log("Message Sent!!!\n");
    });

    client->receive().then([ws_response](websocket_incoming_message i_msg){ 
           return i_msg.extract_string();
        }).then([ws_response](std::string ws_body){ 
                 ws_response = ws_body;  
        });

   log("WS_RESPONSE:%s:\n",ws_response.c_str());
    return ws_response;
  }

Я попытался
1.Объявление ws_response в качестве ссылки
2. Захват ws_response в качестве ссылки в лямбде
3.Объявление ws_response как cpprest json и присвоение ответа в виде поля json (ws_response [U ("output")] = json :: value :: string (ws_body.c_str ()))

без удачи.

У меня нет большого опыта программирования на C ++ и я с этим борюсь.

Может кто-нибудь помочь мне с тем, как перехватить этот ответ вне лямбды, чтобы я мог вернуть значение вызывающему методу?

Спасибо и С уважением,
Свати Десаи

1 Ответ

1 голос
/ 31 марта 2020

[ws_response](websocket_incoming_message i_msg){ return i_msg.extract_string(); }

Нет причин, по которым вышеуказанная лямбда вообще может захватить ws_response, поскольку она не использует ws_response для чего-либо.

[ws_response](std::string ws_body){ ws_response = ws_body; }

Вышеупомянутая лямбда должна захватить ws_response по ссылке , чтобы правильно ее изменить. Способ кодирования лямбды в настоящее время позволяет получить копию из ws_response по значению , и эта копия равна const, поскольку лямбда не объявлена как mutable. Вот почему вы получаете ошибку компилятора - вы пытаетесь присвоить ws_body объекту const std::string, который является локальным для лямбды, а не переменной ws_response, объявленной в send_command(). Вышеупомянутая лямбда равна примерно эквивалентно этому:

const std::string ws_response_copy = ws_response;
ws_response_copy = ws_body; // <-- ERROR

Попробуйте вместо этого:

client->receive().then([](websocket_incoming_message i_msg){ 
    return i_msg.extract_string();
}).then([&ws_response](std::string ws_body){ 
    ws_response = ws_body;  
});

В качестве альтернативы, extract_string() возвращает pplx::task<std::string>, который имеет get() метод для получения фактического std::string, ожидающего, пока он не станет доступен. Таким образом, вышесказанное можно упростить до следующего:

client->receive().then([&ws_response](websocket_incoming_message i_msg){ 
    ws_response = i_msg.extract_string().get();
});
...