1

サーバーに接続するクライアントをクラスなしで単一のファイルにコーディングしました。これは明らかに良いプログラミング方法ではないため、コードが最終的に希望どおりに動作したとき、次の client.h を使用して myclient クラスを作成しました。

    #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::bindが必要であることがわかりました

 resolver.async_resolve(query, boost::bind(&myclient::resolve_handler, this)); 

しかし、どういうわけかこれは正しくありません..エラーが発生します:

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

編集:返信ありがとうございます..しかし、さらにエラーが発生しているようです。些細なことを見逃していますか?ここに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
4

1 に答える 1

2

への引数のプレースホルダーを忘れていますresolve_handler:

boost::bind(&myclient::resolve_handler, this,
    boost::asio::placeholders::error, 
    boost::asio::placeholders::iterator)
于 2013-03-18T11:20:48.197 に答える