2017-08-04 145 views
1

叫我用一个类来包装的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导致错误

参考非静态成员函数必须被调用

有什么合作正确的语法来做到这一点?

+0

我不认为你引用正确的信息。 – 2017-08-04 18:21:03

+0

一个小问题,但在类体内,你可以参考'Socket ',就像'Socket'一样,例如在你的构造函数和析构函数中 –

回答

3

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

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

相关问题