Как вызвать boost async_connect как функцию-член, используя lamba в качестве обработчика соединения

Я реализовал async_connect успешно использовать его как свободную функцию и лямбда-код как connect_handler следующим образом:

auto self(shared_from_this());
boost::asio::async_connect(m_socket, endpoint_iter, [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

Тем не менее, теперь я вынужден использовать no_delay флаг. По поводу этой записи boost :: asio с no_delay невозможен? Я должен вызвать async_connect как функцию-член сокета. Пытаясь следующим образом

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

мой компилятор (VS2013) выдает мне ошибку Error 1 error C2338: ConnectHandler type requirements not met

У кого-нибудь есть идеи, как это правильно сделать?

1

Решение

Подпись обработчика свободной функции async_connect должно быть:

void handler(const boost::system::error_code& error, Iterator iterator);

Подпись обработчика функции-члена basic_stream_socket::async_connect должно быть:

void handler(const boost::system::error_code& error);

Причина в том, что вы даете несколько конечных точек свободной функции, которая затем возвращает вам итератор, чтобы сообщить вам, какой из них был подключен, в то время как вы предоставляете только одну конечную точку функции-члену, которая не должна сообщать вам, какая из них была подключена с тех пор, как вы только при условии один.

Поэтому для того, чтобы ваш код работал, вам, скорее всего, нужно просто удалить итератор из параметров вашего лямбда-обратного вызова:

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec){...}
1

Другие решения

Других решений пока нет …