#c #boost #boost-asio
#c #повышение #boost-asio
Вопрос:
У меня не было проблем с блокировкой сокетов asio, но мое изучение асинхронных сокетов было кошмаром. может быть, я просто исчерпан:
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(newip, newport);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::system::error_code ec;
auto f = std::bind(amp;Irc::connect_handler, this, boost::asio::placeholders::error,
boost::asio::placeholders::iterator);
boost::asio::async_connect(socket, endpoint_iterator, f);
мой обработчик определен как функция-член в классе Irc:
void connect_handler(
const boost::system::error_codeamp; ec,
boost::asio::ip::tcp::resolver::iterator i)
{
// ...
}
Я на VS2013, и ошибки не очень
1>------ Build started: Project: Project18, Configuration: Debug Win32 ------
1> Irc.cpp
1>c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1149): error C2664: 'void std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>::operator ()(_Farg0 amp;,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>) const' : cannot convert argument 2 from 'boost::arg<1>' to 'const boost::system::error_code amp;'
1> with
1> [
1> InternetProtocol=boost::asio::ip::tcp
1> , _Farg0=Irc
1> ]
1> Reason: cannot convert from 'boost::arg<1>' to 'const boost::system::error_code'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 amp;,Arg2 amp;>,std::_Arg_idx<0,1,2>)' being compiled
1> with
1> [
1> InternetProtocol=boost::asio::ip::tcp
1> , Arg1=const boost::system::error_code
1> , Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 amp;,Arg2 amp;>,std::_Arg_idx<0,1,2>)' being compiled
1> with
1> [
1> InternetProtocol=boost::asio::ip::tcp
1> , Arg1=const boost::system::error_code
1> , Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1> ]
1> c:localboost_1_55_0boostasiodetailhandler_type_requirements.hpp(98) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::operator ()<Arg1amp;,Arg2amp;>(Arg1 amp;,Arg2 amp;)' being compiled
1> with
1> [
1> InternetProtocol=boost::asio::ip::tcp
1> , Arg1=const boost::system::error_code
1> , Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1> ]
1> c:localboost_1_55_0boostasioimplconnect.hpp(257) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::operator ()<Arg1amp;,Arg2amp;>(Arg1 amp;,Arg2 amp;)' being compiled
1> with
1> [
1> InternetProtocol=boost::asio::ip::tcp
1> , Arg1=const boost::system::error_code
1> , Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1> ]
1> c:userscdocumentsvisual studio 2012projectsproject18project18irc.cpp(37) : see reference to function template instantiation 'boost::asio::async_result<Handler>::type boost::asio::async_connect<Protocol,StreamSocketService,boost::asio::ip::basic_resolver_iterator<InternetProtocol>,std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>amp;>(boost::asio::basic_socket<Protocol,StreamSocketService> amp;,Iterator,ComposedConnectHandler)' being compiled
1> with
1> [
1> Handler=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>
1> , Protocol=boost::asio::ip::tcp
1> , StreamSocketService=boost::asio::stream_socket_service<boost::asio::ip::tcp>
1> , InternetProtocol=boost::asio::ip::tcp
1> , Iterator=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1> , ComposedConnectHandler=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;> amp;
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Комментарии:
1. Закрыт, потому
asker is just exhausted
что?2. просто используйте лямбда-выражение вместо этой привязки.
Ответ №1:
Если вы используете std::bind
, вам также необходимо использовать std::placeholders
. Заполнители asio работают только с boost::bind
.
Так что это должно исправить:
auto f = std::bind(amp;Irc::connect_handler, this, std::placeholders::_1, std::placeholders::_2);
Комментарии:
1. 7 утра отсутствие кодирования сна приводит к этой ерунде, твой друг
2. Честно говоря, я думаю, что использование
boost::bind
более чистое, так как это позволит вам писать более выразительноboost::asio::placeholders
. Кроме того,boost::bind
поддерживаетсяboost::shared_ptr
с помощью функций-членов, что часто требуется для типичных асинхронных серверных размещений. И тот факт, что это boost, вряд ли является проблемой![]()
Ответ №2:
Вам необходимо использовать boost::bind
с заполнителями asio