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

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

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

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_;
  };

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

Reference to non-static member function must be called

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

最佳答案

delegate.on_read 是一个非静态成员函数,所以它需要一个对象被调用。您可以使用 lambda 来绑定(bind)对象参数:

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

未经测试,但类似的东西应该可以工作。

关于c++ - 必须在模板化类上调用对非静态成员函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513120/

相关文章:

c++ - Visual Studio C++ : Debug Assertion Failed

c++ - 使用 glibc 和 libstdc++ 静态链接

c++ - 错误:在‘it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* 中请求成员 ‘speak’

java - 拆分类后避免耦合

c++ -/是否/memmove 使用中间缓冲区?

c++ - 如何停止命令缓冲区之间的清除?

c++ - 为什么 push_back 和 emplace_back 组合在一起时会有不同的行为

c++ - 通过引用返回 `std::shared_ptr`

c# - EndInvoke() 是可选的、某种可选的还是绝对不是可选的?

c# - C# 是否有方法内部方法的概念?