gpt4 book ai didi

c++ - 使用 boost::async_connect 问题

转载 作者:行者123 更新时间:2023-11-30 02:45:39 25 4
gpt4 key购买 nike

我在修改 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(&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)
{
// ...
}

我在 VS2013 上,错误并不多见

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 ==========

最佳答案

如果您使用 std::bind,您还需要使用 std::placeholders。 asio 占位符仅适用于 boost::bind

所以这应该可以解决它:

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

关于c++ - 使用 boost::async_connect 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24245174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com