2017-08-04 87 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); 

未經測試,但類似的東西應該工作。

相關問題