繁体   English   中英

使用boost :: signals2 :: signal作为处理程序时出错

[英]Error using boost::signals2::signal as handler

在下面的代码中:

   boost::signals2::signal<void(const boost::system::error_code&)> signal;
   socket.async_connect(endpoint, boost::ref(signal));

(位于http://liveworkspace.org/code/e04910cbcc4cfd9e42e34d1af55c393e

我收到此错误:

在boost / asio / detail / wrapped_handler.hpp:18:0,boost / asio / io_service.hpp:24,boost / asio / basic_io_object.hpp:20,boost / asio / basic_socket.hpp:19包含的文件中,从boost / asio / basic_datagram_socket.hpp:20,从boost / asio.hpp:20,从source.cpp:2:boost / asio / detail / bind_handler.hpp:在成员函数'void boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code :: operator()()':boost / asio / handler_invoke_hook.hpp:64:3:从'void boost :: asio :: asio_handler_invoke( boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code,...)'boost / asio / detail / handler_invoke_helpers.hpp:39:3:从'void boost_asio_handler_invoke_helpers实例化: :invoke(const boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code&,boost :: reference_wrapper>&)'boost / asio / detail / bind_handler.hpp:73: 3:从'void boost :: asio :: detail :: asio_handler_invoke(const boost :: asio :: detail :: b实例化 inder1 <boost :: reference_wrapper>,boost :: system :: error_code&,boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code *)'boost / asio / detail / handler_invoke_helpers.hpp:39:3:从'void boost_asio_handler_invoke_helpers :: invoke(const boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code&,boost :: asio ::实例化detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code&)'boost / asio / detail / completion_handler.hpp:63:7:从'static void boost :: asio :: detail :: completion_handler实例化<boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code

:: do_complete(boost :: asio :: detail :: boost :: asio :: detail :: task_io_service *,boost :: asio :: detail :: boost :: asio :: detail :: task_io_service_operation *,boost :: system :: error_code,unsigned int)'boost / asio / detail / completion_handler.hpp:38:17:从'boost :: asio :: detail :: completion_handler <boost :: asio :: detail :: binder1 <boost ::实例化reference_wrapper>,boost :: system :: error_code

:: completion_handler(boost :: asio :: detail :: binder1 <boost :: reference_wrapper> boost :: system :: error_code

)'boost / asio / detail / impl / task_io_service.hpp:50:3:从'void boost :: asio :: detail :: task_io_service :: post(boost :: asio :: detail :: binder1 <boost :: reference_wrapper>,boost :: system :: error_code

)'boost / asio / impl / io_service.hpp:80:3:从'void boost :: asio :: io_service :: post(Handler)实例化'boost / asio / basic_socket.hpp:649:9:从'void实例化boost :: asio :: basic_socket <boost :: asio :: ip :: tcp,boost :: asio :: stream_socket_service :: async_connect(boost :: asio :: basic_socket> :: boost :: asio :: ip :: basic_endpoint &,boost :: reference_wrapper>)'source.cpp:10:53:从此处实例化boost / asio / detail / bind_handler.hpp:40:5:错误:调用'(boost :: reference_wrapper>)不匹配( const boost :: system :: error_code&)'

看起来您的签名错误? 您需要为error_code指定一个占位符

尝试

boost::signals2::signal<void(const boost::system::error_code&)> signal;
socket.async_connect(endpoint, boost::bind(boost::ref(signal), _1));

拉尔夫的答案很接近,我认为您需要将占位符绑定到signal函子:

#include <boost/signals2.hpp>
#include <boost/asio.hpp>

using namespace boost::asio;

int 
main() 
{
   io_service ios;
   ip::tcp::socket socket(ios);
   const ip::tcp::endpoint endpoint(
           ip::address::from_string(""), 
           0
           );

   boost::signals2::signal<void(const boost::system::error_code&)> signal;
   socket.async_connect(
           endpoint, 
           boost::bind(
               boost::ref(signal), _1
               ) 
       );
}

例:

samm@macmini ~$ g++ -I /opt/local/include -L/opt/local/lib -Wl,-rpath,/opt/local/lib -lboost_system signal.cc 
samm@macmini ~$ echo $?
0
samm@macmini ~$ 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM