2013-03-18 62 views
1

予編碼,其連接到一臺服務器在單個文件中沒有任何類的客戶端。這顯然心不是編程的一個很好的方式,所以當代碼最終表現爲我想,我創建了myclient類具有以下client.h:誤差成員函數指針,助推綁定

#include <boost/asio.hpp> 
    #include <boost/array.hpp> 
    #include <iostream> 
    #include <string> 
    #include "mtbf.h" 
    #include <boost/date_time/posix_time/posix_time.hpp> 

    class myclient 
    { 
    public: 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver resolver; 
    boost::asio::ip::tcp::socket sock; 
    boost::array<char, 4096> buffer; 
    typedef boost::posix_time::time_duration duration_t; 
    typedef boost::posix_time::ptime timestamp_t; 
    std::vector<std::string> tokens; 
    boost::system::error_code m_err_feedback; 



      enum ConnectionState 
     { 
      WAIT_FOR_HEADER, 
      WAIT_FOR_DATA, 
      PACKET_COMPLETE 
     }; 
    myclient(std::string port); 
    private: 
     void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred); 
     void connect_handler(const boost::system::error_code &ec); 
     void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it); 

    }; 

我不寫client.cpp的全部代碼,但這裏是錯誤發生時(構造函數)

myclient::myclient(std::string port):resolver(io_service),sock(io_service) 
    { 
     tcp::resolver::query query("127.0.0.1", port); 
     resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this)); 
     io_service.run(); 
    } 

我是相當新的C++,但我得到我需要一個boost ::綁定來調用

resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this)); 
一個成員函數的引用

但不知何故小號心不是很right..i得到一個錯誤:

error 8 error C2298: 'return': Invalid procedure for an expression with pointer to memberfunction C:\projekte\libs\boost_1_53_0-VC11\boost\bind\mem_fn.hpp 342 1 client 

編輯:感謝您reply..but似乎還有更多的只是未來的錯誤。我錯過了一些微不足道的東西嗎?下面是從client.cpp代碼(我刪除了實際算法read_handler因爲它不重要)

#include "client.h" 
    using boost::asio::ip::tcp; 

    myclient::myclient(std::string port):resolver(io_service),sock(io_service) 
    { 
     tcp::resolver::query query("127.0.0.1", port); 
     resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this,boost::asio::placeholders::error,boost::asio::placeholders::iterator)); 
     io_service.run(); 
    } 

    void myclient::read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
    { 

    . 
    . 
    . 


    } 

    void myclient::connect_handler(const boost::system::error_code &ec) 
    { 
     if (!ec) 
     { 
     sock.async_read_some(boost::asio::buffer(buffer), boost::bind(&myclient::read_handler, this,&ec)); 
     } 
    } 

    void myclient::resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
    { 
     if (!ec) 
     { 
     sock.async_connect(*it, boost::bind(&myclient::connect_handler, this, &ec, it)); 
     } 
    } 

有了這個,我得到這樣的錯誤:

error 2 error C2825: "F": must be a class or namespace "::". C:\projekte\libs\boost_1_53_0-VC11\boost\bind\bind.hpp 69 1 client 
error 3 error C2039: 'result_type': is not an element of '`global namespace'' C:\projekte\libs\boost_1_53_0-VC11\boost\bind\bind.hpp 69 1 client 

回答

2

你忘了佔位符來傳遞參數到resolve_handler

boost::bind(&myclient::resolve_handler, this, 
    boost::asio::placeholders::error, 
    boost::asio::placeholders::iterator) 
+0

感謝您的回覆,即時通訊仍然得到錯誤,我編輯更details..help的問題是非常感謝! – 2013-03-18 11:32:44

+0

好的,謝謝。我解決它......我的boost ::綁定理解wasnt好enough.i只是不得不調整每一個的boost ::綁定所需的PARAMS。謝謝你,先生! – 2013-03-18 11:52:49