2014-06-16 1 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 클래스의 멤버 함수로 정의됩니다 : VS2013에

void connect_handler(
    const boost::system::error_code& ec, 
    boost::asio::ip::tcp::resolver::iterator i) 
    { 
    // ... 
    } 

임 오류가 꽤

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

청산 때문에? – sehe

+0

그냥 바인딩 대신 람다를 사용하십시오. – Abyx

답변

3

std::bind을 사용하는 경우 std::placeholders을 사용하십시오. asio 자리 표시자는 boost::bind으로 만 작동합니다.

그래서 그것을 해결해야 _`asker 그냥 exhausted`_됩니다

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

오전 7시 수면 코딩이 말도 안되는 tahnk 친구에게 연결됩니다. – 2c2c

+0

솔직히 말해서, 저는 boost :: bind ::를 사용하면 더 표현력있는 boost :: asio :: placeholders를 작성할 수 있기 때문에 청소기라고 생각합니다. 또한 boost :: bind는 멤버 함수로 boost :: shared_ptr를 지원하는데, 이는 전형적인 비동기 서버 설정에 자주 요구된다. 그리고 그것이 부스트라는 사실은 거의 문제가되지 않습니다 :) – sehe

0

을이 arent 당신은 boost::bind를 사용할 필요가 asio 자리 표시 자 사용

관련 문제