2014-06-16 51 views
1

我没有问题修补asio的阻塞套接字,但我深入研究异步的是一场噩梦。也许我只是耗尽:使用boost :: async_connect问题

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(&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_code& ec, 
    boost::asio::ip::tcp::resolver::iterator i) 
    { 
    // ... 
    } 

IM在VS2013和错误的arent相当

1>------ Build started: Project: Project18, Configuration: Debug Win32 ------ 
1> Irc.cpp 
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1149): error C2664: 'void std::_Pmf_wrap<void (__thiscall Irc::*)(const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>::operator()(_Farg0 &,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>) const' : cannot convert argument 2 from 'boost::arg<1>' to 'const boost::system::error_code &' 
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.0\vc\include\functional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::*)(const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> &,boost::arg<2> &>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 &,Arg2 &>,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.0\vc\include\functional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::*)(const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> &,boost::arg<2> &>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 &,Arg2 &>,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:\local\boost_1_55_0\boost\asio\detail\handler_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 &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> &,boost::arg<2> &>::operator()<Arg1&,Arg2&>(Arg1 &,Arg2 &)' 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:\local\boost_1_55_0\boost\asio\impl\connect.hpp(257) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::*)(const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> &,boost::arg<2> &>::operator()<Arg1&,Arg2&>(Arg1 &,Arg2 &)' 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:\users\c\documents\visual studio 2012\projects\project18\project18\irc.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 &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> &,boost::arg<2> &>&>(boost::asio::basic_socket<Protocol,StreamSocketService> &,Iterator,ComposedConnectHandler)' being compiled 
1>   with 
1>   [ 
1>    Handler=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::*)(const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> &,boost::arg<2> &> 
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 &,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code &,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> &,boost::arg<2> &> & 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

关闭,因为_'asker只是exhausted'_? – sehe

+0

只是使用lambda而不是绑定。 – Abyx

回答

3

如果您使用std::bind您还需要使用std::placeholders。 asio占位符仅与boost::bind一起工作。

所以这应该修复它:

auto f = std::bind(&Irc::connect_handler, this, std::placeholders::_1, std::placeholders::_2); 
+1

早上7点没有睡眠编码导致这个废话塔克你的朋友 – 2c2c

+0

说实话,我认为使用'boost :: bind'更清洁,因为它会让你写更具表现力的'boost :: asio :: placeholders'。另外,'boost :: bind'支持'boost :: shared_ptr'和成员函数,这对于典型的异步服务器场景来说是经常需要的。而且,它的提升并不是问题:) – sehe

0

您需要使用boost::bind与asio的占位符