参考非静态成员函数必须在模板类
问题描述:
叫我用一个类来包装的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);
未经测试,但类似的东西应该工作。
我不认为你引用正确的信息。 – 2017-08-04 18:21:03
一个小问题,但在类体内,你可以参考'Socket',就像'Socket'一样,例如在你的构造函数和析构函数中 –