Вы вызываете async_connect с парой итераторов, поэтому ваша лямбда должна соответствовать требованиям обработчика подключения итератора . В качестве второго параметра вы должны передать подключенную конечную точку .
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
[&, sp]( boost::system::error_code ec,
boost::asio::ip::tcp::resolver::iterator it)
{
if (ec) {
return;
}
//...
Чтобы быть в соответствии со ссылкой, вы должны также исправить версию bind. on_connect
также должен принимать iterator
в качестве второго параметра.
Ваша текущая версия bind
компилируется и работает, но когда асинхронная операция, инициированная async_connect
, завершена, функтор, созданный bind
, вызывается только с error_code
, вы не можете получить доступ к endpoint
. Вы можете изменить связывание так, чтобы оно занимало on_connect
без каких-либо аргументов.
void on_connect(){}
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(), results.end(), std::bind(on_connect)); // compiles fine
это также компилируется, но когда вызывается обработчик, ни error_code
, ни endpoint
не могут быть доступны. (Да, немного странно, что вы не получаете ошибок компилятора при использовании bind
, которые сообщают, что требования обработчика не выполняются. Я не знаю, откуда возникло это несоответствие между лямбда и связыванием.)