Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::async\u连接问题_C++_Boost_Boost Asio - Fatal编程技术网

C++ 使用boost::async\u连接问题

C++ 使用boost::async\u连接问题,c++,boost,boost-asio,C++,Boost,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

我在修补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 ==========
1>----构建已启动:项目:项目18,配置:调试Win32------
1> Irc.cpp
1> c:\program files(x86)\microsoft visual studio 12.0\vc\include\functional(1149):错误C2664:'void std:'u Pmf\u wrap::operator()('u Farg0&,const boost::system::error\u code&,boost::asio::ip::basic\u resolver\u iterator)const':无法将参数2从'boost::arg'转换为'const boost::system::error\u code&'
1> 与
1>          [
1> InternetProtocol=boost::asio::ip::tcp
1> ,_Farg0=Irc
1>          ]
1> 原因:无法从“boost::arg”转换为“const boost::system::error\u code”
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\functional(1137):请参阅正在编译的函数模板实例化“void std::_Bind::_Do_call(std::tuple,std:_Arg_idx)”的参考
1> 与
1>          [
1> InternetProtocol=boost::asio::ip::tcp
1> ,Arg1=const boost::system::error\u代码
1> ,Arg2=boost::asio::ip::basic\u解析器\u迭代器
1>          ]
1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\functional(1137):请参阅正在编译的函数模板实例化“void std::_Bind::_Do_call(std::tuple,std:_Arg_idx)”的参考
1> 与
1>          [
1> InternetProtocol=boost::asio::ip::tcp
1> ,Arg1=const boost::system::error\u代码
1> ,Arg2=boost::asio::ip::basic\u解析器\u迭代器
1>          ]
1> c:\local\boost\u 1\u 55\u 0\boost\asio\detail\handler\u type\u requirements.hpp(98):请参阅正在编译的函数模板实例化“void std::\u Bind::operator()(Arg1&,Arg2&)”的参考
1> 与
1>          [
1> InternetProtocol=boost::asio::ip::tcp
1> ,Arg1=const boost::system::error\u代码
1> ,Arg2=boost::asio::ip::basic\u解析器\u迭代器
1>          ]
1> c:\local\boost\u 1\u 55\u 0\boost\asio\impl\connect.hpp(257):请参阅正在编译的函数模板实例化“void std::_Bind::operator()(Arg1&,Arg2&)”的参考
1> 与
1>          [
1> InternetProtocol=boost::asio::ip::tcp
1> ,Arg1=const boost::system::error\u代码
1> ,Arg2=boost::asio::ip::basic\u解析器\u迭代器
1>          ]
1> c:\users\c\documents\visual studio 2012\projects\project18\project18\irc.cpp(37):请参阅正在编译的函数模板实例化“boost::asio::async\u结果::type boost::asio::async\u connect(boost::asio::basic_socket&、迭代器、ComposedConnectHandler)”
1> 与
1>          [
1> Handler=std::\u绑定
1> ,Protocol=boost::asio::ip::tcp
1> ,StreamSocketService=boost::asio::stream\u socket\u服务
1> ,InternetProtocol=boost::asio::ip::tcp
1> ,Iterator=boost::asio::ip::basic\u resolver\u Iterator
1> ,ComposedConnectHandler=std::\u Bind&
1>          ]
======生成:0成功,1失败,0最新,0跳过==========

您需要将
boost::bind
与asio占位符一起使用

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

所以这应该可以解决这个问题:

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

关闭是因为asker已经筋疲力尽了?只需使用lambda而不是bind。早上7点无睡眠编码会导致这种胡说八道,朋友们说实话,我认为使用
boost::bind
更干净,因为它会让你编写更具表现力的
boost::asio::占位符
。另外,
boost::bind
支持带有成员函数的
boost::shared_ptr
,这是典型异步服务器位置经常需要的。而且,它的助推作用几乎不成问题:)