2017-11-23 20 views
1

メンバー関数をAcceptHandlerとしてboost :: asioのasync_accept()メソッドに渡そうとしています。私は、コンパイルエラーは言ってます:リンクラインからboost :: asioメンバー関数をacceptor.async_accept()に渡す方法

を満たしていない

AcceptHandlerタイプの要件:

//あなたが次の行にエラーが発生した場合、それはあなたのことを意味しハンドラが、AcceptHandlerの文書化された型要件を満たしていません。 documentation

ハンドラは、このように見えるように持っていると言う:

void accept_handler(const boost::system::error_code& error) //documentation 
{ 
    if (!error) 
    { 
    // Accept succeeded. 
    } 
} 

私のメンバ関数は次のようになります。

void WifiConnector::onAccept(const boost::system::error_code &ec) //my code 
{ 
    if (ec) { 
     std::cout << ec.message(); 
     return; 
    } 
    socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler); 
} 

私はそれには差は認められません。

しかし、私はこのようacceptor.async_accept()メソッドを呼び出す必要があります:それは私がとるメンバ関数であるため、

acceptor.async_accept(socket, &WifiConnector::onAccept); //my code 

代わりの

acceptor.async_accept(socket, accept_handler); //documentation 

。ドキュメントが示唆するように私がそれを渡そうとすると、次のようにエラーが表示されます:オーバーロードされた関数のインスタンスがありません。

メンバー関数を間違った方法で渡しているか、間違っていますか?

は編集:私は間違った方法または何にメンバ関数を渡していますので、 私はアクセプタなど

+0

&WifiConnector :: onAcceptのオブジェクトはどこにありますか?静的メソッドではありません。 –

+0

それは他のどこかで作成され、ちょうどスタートアップコールを取得します。その他のメソッド呼び出し( 'async_accept()'など)はすべてオブジェクト内で行われます。 – MrJonas

答えて

1

ブーストドキュメントはアクセプタhere

上記のリンクからの抜粋に非静的メソッドを渡す方法を明示的にそれを言及します。

0

を保持するオブジェクト内からasync_accept()メソッドを呼び出していますがエラーです私は間違っている?

プレーン関数と呼び出し(静的でない)メンバ関数の呼び出しに違いがあります。後者は、適切なオブジェクトと共に呼び出すことしかできません。したがって、通話を転送するにはさまざまな方法のいずれかを使用する必要があります。他のスレッドが参照することにより、今それにアクセスし、所有しているスレッドが保持していることに依存してもよいとあなたは、あなたの無線LANのオブジェクトの寿命に関するいくつかの深刻な思考をしなければならないことが

WifiConnector wifi; 
... 
acceptor.async_accept(socket, [&wifi] (const auto& ec) { wifi.onAccept(ec); }); 

注:最も簡単な方法は、ラムダを使用していますオブジェクトは生きている。たとえば、単純な参照ではなくshared_ptrまたはweak_ptrのオブジェクトを渡すことは、asioコールバック内で珍しいことではありません。あなたのクラスならば

void my_class::accept_handler(
    const boost::system::error_code& ec) 
{ 
    ... 
} 
... 
acceptor.async_accept(..., 
    boost::bind(&my_class::accept_handler, 
     this, boost::asio::placeholders::error)); 

あなたはインスタンスとthisを置き換えることができます。

関連する問題