【问题标题】:errors using boost::function with boost::bind with boost::asio使用 boost::function 和 boost::bind 和 boost::asio 的错误
【发布时间】:2014-12-19 16:01:28
【问题描述】:

我在将 boost::function 与 boost::bind 和 boost::asio 结合使用时遇到了问题。我正面临代码的 sn-ps,编译器抛出大量错误,我正在粘贴根错误。

static void
startAccept(boost::asio::io_service &io,
        boost::asio::ssl::context &ctx,
        boost::asio::ip::tcp::acceptor &acceptor_,
        const boost::system::error_code &ec
        )
{
    //details omitted for brevity reasons.
    return;
}
 boost::function<void(
                boost::asio::io_service &,
                boost::asio::ssl::context &,
                boost::asio::ip::tcp::acceptor &,
                boost::system::error_code &
                )> f;
        f = boost::bind(&startAccept,
                boost::ref(io),
                boost::ref(ctx),
                boost::ref(acceptor_), 
                boost::asio::placeholders::error);

错误:

In file included from as.cc:5:
In file included from /usr/local/include/boost/bind.hpp:22:
/usr/local/include/boost/bind/bind.hpp:457:93: error: no viable conversion from 'boost::asio::io_service' to
      'const boost::system::error_code'
        unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
                                                                                            ^~~~~~~~~~~~~~~~~
/usr/local/include/boost/system/error_code.hpp:317:11: note: candidate constructor (the implicit copy constructor) not viable: no known
      conversion from 'boost::asio::io_service' to 'const boost::system::error_code &' for 1st argument
    class error_code
          ^
/usr/local/include/boost/system/error_code.hpp:317:11: note: candidate constructor (the implicit move constructor) not viable: no known
      conversion from 'boost::asio::io_service' to 'boost::system::error_code &&' for 1st argument
    class error_code
          ^

为什么编译器试图将 boost::asio::io_service 转换为 boost::system::error_code ?

【问题讨论】:

    标签: boost-asio boost-bind boost-function


    【解决方案1】:

    由于签名已经匹配,分配给 boost::function: 时不需要使用 boost::bind:

    #include <boost/asio.hpp>
    #include <boost/asio/ssl.hpp>
    #include <boost/bind.hpp>
    #include <boost/function.hpp>
    
    static void startAccept(boost::asio::io_service &io, boost::asio::ssl::context &ctx,
                            boost::asio::ip::tcp::acceptor &acceptor_, boost::system::error_code ec) {
        // details omitted for brevity reasons.
        return;
    }
    
    int main() {
        boost::function<void(boost::asio::io_service &, boost::asio::ssl::context &, boost::asio::ip::tcp::acceptor &,
                boost::system::error_code)> f;
    
        f = &startAccept;
    }
    

    请注意,我更改了最后一个参数,因为它在 const&/& ness 中不匹配。但这不是问题。

    一旦绑定了第一个参数,绑定的签名就变成了一元函数。这可能是您想要作为完成处理程序传递的内容(取决于完成处理程序签名应该是什么):

    object.async_operation(bufs, boost::bind(f,
                boost::ref(io), boost::ref(ctx), boost::ref(acceptor_),
                boost::asio::placeholders::error))
    

    在这种情况下,它是一个一元完成处理程序,与 boost::function&lt;void(boost::system::error_code)&gt; 兼容

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2023-04-07
      • 2012-09-27
      相关资源
      最近更新 更多