繁体   English   中英

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

[英]Reference to non-static member function must be called on templated class

我有一个用于包装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导致错误

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

正确的语法是什么?

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);

未经测试,但类似的东西应该起作用。

暂无
暂无

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

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