使用boost :: bind绑定错误的模板类方法

时间:2016-08-16 17:30:06

标签: c++ boost

有一个基类asio_handler

class T>是定义boost :: asio socket的类型(纯文本,或包裹ssl)

template <class T> asio_handler:
{
    // ...
    asio_handler(const std::shared_ptr<T> sock)
    : socket_(sock)
    {}

    // this method handles connections
    void do_connect(const boost::system::error_code & err)
    {
        boost::asio::async_read_until(*socket_,
                                      http_response::buffer_,
                                      rn_,
                                      boost::bind(&asio_handler<T>::read_status_line, 
                                                  this, 
                                                  boost::asio::placeholders::error));
    }

    void read_status_line(const boost::system::error_code & err)
    {
         // same as before, binding to an asio_handler<T>::method
    }

private:
    const std::shared_ptr<T> socket_;
};

其中一个继承类是asio_http,它使用http_socket

typedef boost::asio::ip::tcp::socket http_socket;
class asio_http : public asio_handler<http_socket>
{
    // ... construct appropriately

    void connect(const boost::system::error_code err)
    {
        boost::asio::async_write(*socket_,
                                     request_,
                                     boost::bind(&asio_handler<http_socket>::do_request<http_socket>, 
                                                 this,
                                                 boost::asio::placeholders::error));
    }
};

问题似乎是绑定的模板类方法未知? (除非我错过了解,这不会让我感到惊讶)。

/usr/local/include/boost/bind/bind.hpp:69:22: error: type 'void (rapp::cloud::asio_handler<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >::*)(const
      boost::system::error_code &)' cannot be used prior to '::' because it has no members
    typedef typename F::result_type type;
                     ^

这似乎与:

有关
/usr/local/include/boost/bind/bind_template.hpp:15:22: note: in instantiation of template class 'boost::_bi::result_traits<boost::_bi::unspecified, void (rapp::cloud::asio_handler<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
      boost::asio::stream_socket_service<boost::asio::ip::tcp> > >::*)(const boost::system::error_code &)>' requested here
    typedef typename result_traits<R, F>::type result_type;

从继承类绑定的所有回调传播到基类回调。

1 个答案:

答案 0 :(得分:-1)

我在上面发布的这个非常神秘的错误是由:

生成的

Apple LLVM version 7.0.2 (clang-700.1.81)

尝试在Ubuntu / GCC下编译相同的代码产生了一个更有用的错误:

/usr/include/boost/bind/bind.hpp: In instantiation of ‘struct boost::_bi::result_traits<boost::_bi::unspecified, void (rapp::cloud::asio_handler<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::*)(const boost::system::error_code&)>’:

在Google上搜索我发现this blog post,这解释了错误只是方法签名与占位符不匹配。

确实如此,解决方案很简单:

void read_content(
                  const boost::system::error_code & err,
                  const std::size_t bytes
                 );

我真的希望这会帮助像我一样坚持这个人,错误很愚蠢,但产生的错误信息很难让decypher。

最终这是我的错误,因为boost::asio::async_read功能在参数上是明确的。