必须在模板化类上调用对非静态成员函数的引用

时间:2017-08-04 18:12:25

标签: c++ c++11 delegates boost-asio

我有一个用于包装boost :: asio的类,我使用模板来定义委托:

template <class T>
  struct Socket : public std::enable_shared_from_this<Socket<T>> {

    explicit Socket<T>(T &delegate, const std::string &socket) : endpoint_{socket} {
      socket_.reset(new asio::generic::stream_protocol::socket(service_));
      socket_->connect(endpoint_, delegate_.error_code);
      socket_->non_blocking(true);
    }

    void read() const noexcept {
      std::vector<byte> bytes;
      asio::async_read(*socket_, asio::buffer(bytes), asio::transfer_all(), delegate_.on_read);
    }

    virtual ~Socket<T>() noexcept = default;

   private:
    asio::io_service service_;
    std::unique_ptr<asio::generic::stream_protocol::socket> socket_;
    asio::local::stream_protocol::endpoint endpoint_;
    T delegate_;
    std::vector<byte> buffer_;
  };

我的问题是将委托方法作为处理程序传递给asio::async_read会导致错误

  

必须调用对非静态成员函数的引用

执行此操作的正确语法是什么?

1 个答案:

答案 0 :(得分:2)

delegate.on_read是一个非静态成员函数,因此需要调用一个对象。您可以使用lambda绑定对象参数:

auto read_handler = 
  [this](const boost::system::error_code& ec, std::size_t bytes_transferred) {
    on_read(ec, bytes_transferred);
  };
asio::async_read(*socket_, asio::buffer(bytes), 
                  asio::transfer_all(), read_handler);

未经测试,但这样的事情应该有用。