C++ 必须对模板化类调用对非静态成员函数的引用
我有一个用于包装boost::asio的类,我使用模板定义委托: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_
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
,例如在构造函数和析构函数中