【问题标题】:Error using boost::signals2::signal as handler使用 boost::signals2::signal 作为处理程序时出错
【发布时间】:2011-07-06 02:57:14
【问题描述】:

在以下代码中:

   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::system::error_code ::操作员()()': boost/asio/handler_invoke_hook.hpp:64:3: 从 'void boost::asio::asio_handler_invoke( boost::asio::detail::binder1, 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::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::binder1, boost::system::error_code &, boost::asio::detail::binder1, 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::system::error_code &, boost::asio::detail::binder1, boost::system::error_code & )' boost/asio/detail/completion_handler.hpp:63:7: 从 'static void boost::asio::detail 实例化 ::completion_handler, 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::system::error_code

::completion_handler( boost::asio::detail::binder1, 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::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::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 &)'

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

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

    试试

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

    【讨论】:

    • 为什么这对 boost::function 是正确的? boost::function 信号; socket.async_connect(端点, 信号);
    【解决方案2】:

    Ralf 的answer 很接近,我认为您需要将占位符绑定到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 ~$ 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多