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

C++ 必须对模板化类调用对非静态成员函数的引用,c++,c++11,delegates,boost-asio,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_

我有一个用于包装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_;
  };
模板
struct Socket:public std::从此\u启用\u共享\u{
显式套接字(T&delegate,const std::string&Socket):端点{Socket}{
socket_u.reset(新asio::generic::stream_协议::socket(service_u));
套接字->连接(端点、委托错误代码);
套接字->非阻塞(真);
}
void read()常量noexcept{
std::向量字节;
asio::异步读取(*套接字读取,asio::缓冲区(字节),asio::传输读取全部(),委托读取);
}
virtual~Socket()noexcept=默认值;
私人:
asio::io_服务u;
std::唯一的ptr插座;
asio::local::stream_协议::endpoint_;
T代表!;
向量缓冲区;
};
我的问题是,将委托方法作为处理程序传递给
asio::async\u read
会导致错误

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


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

委托。on\u 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);

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

我认为您没有正确引用消息。这是一个次要问题,但在类主体中,您可以将
Socket
称为
Socket
,例如在构造函数和析构函数中