boost::bind を使用して、ハンドラー関数を boost::asio::async_write に渡します。無料の関数を使用すると問題なく動作しますが、関数をクラス内に移動しようとすると、バインドで解読できないエラーが発生します。
機能するもの:
私はいくつかのデータを書きます:
boost::asio::async_write(*socket,
boost::asio::buffer(data(),
length()),
boost::bind(handlermessagewrite,
boost::asio::placeholders::error,
this,
boost::asio::placeholders::bytes_transferred));
次に、シグネチャが次のフリー関数で書き込みを処理します。
void handlermessagewrite(const boost::system::error_code& errorcode,
iodata *msg,
size_t bytes_transferred);
これはすべて期待どおりに機能します。
私がやろうとしていること:
クラス内でハンドラーを移動していioclient
ます:
class ioclient {
public:
void handlermessagewrite(const boost::system::error_code& errorcode,
iodata *msg,
size_t bytes_transferred);
}
void ioclient::handlermessagewrite(const boost::system::error_code& errorcode,
iodata *msg,
size_t bytes_transferred);
公式の asio チュートリアルに見られるように、それに応じて boost::bind コードを調整します。
- boost::bind(handlermessagewrite,
+ boost::bind(&ioclient::handlermessagewrite,
ただし、これにより、いくつかの非常に不透明なコンパイル エラーが発生します。これは、IDE で行の 1 つが切り詰められているように見えるという事実 (code::blocks) によって助けられません。
\boost\bind\bind_template.hpp|102| 'boost::_bi::bind_t::result_type boost::_bi::bind_t::operator()(const A1&, const A2&) [with A1 = boost::system::error_code; から必要。A2 = 符号なし int; R = ボイド; F = ブースト::_mfi::mf2; L = boost::_bi::list3 (*)(), boost::_bi::value, boost::arg<2> (*)()>; boost::_bi::bind_t::result_type = void]'| \boost\asio\impl\write.hpp|261| 'void boost::asio::detail::write_op::operator()(const boost::system::error_code&, std::size_t, int) から必要 [with AsyncWriteStream = boost::asio::basic_stream_socket; CompletionCondition = boost::asio::detail::transfer_all_t; WriteHandler = boost::_bi::bind_t、boost::_bi::list3 (*)()、boost::_bi::va| \boost\asio\impl\write.hpp|585| 「void boost::asio::async_write(AsyncWriteStream&, const ConstBufferSequence&, WriteHandler&&) [with AsyncWriteStream = boost::asio::basic_stream_socket; ConstBufferSequence = boost::asio::mutable_buffers_1; WriteHandler = boost::_bi::bind_t、boost::_bi::list3 (*)()、boost::_bi::value、boost::arg<2> (*)()> >]'| \iodata.cpp|76| ここから必要| \boost\bind\bind.hpp|392|エラー: '(boost::_mfi::mf2) (const boost::system::error_code&, iodata*&, const unsigned int&)' の呼び出しに一致しません | \boost\bind\mem_fn_template.hpp|253|注: 候補は:| \boost\bind\mem_fn_template.hpp|278|注: R boost::_mfi::mf2::operator()(T*, A1, A2) const [with R = void; T = ioclient; A1 = const boost::system::error_code&; A2 = iodata*]| \boost\bind\mem_fn_template.hpp|278|注: 'const boost::system::error_code' から 'ioclient*' への引数 1 の既知の変換はありません | | \boost\bind\mem_fn_template.hpp|283|注: テンプレート R boost::_mfi::mf2::operator()(U&, A1, A2) const [with U = U; R = ボイド; T = ioclient; A1 = const boost::system::error_code&; A2 = iodata*]| \boost\bind\mem_fn_template.hpp|283|メモ: テンプレート引数の推定/置換に失敗しました:| \boost\bind\bind.hpp|392|注: '(& a)->boost::_bi::list2::operator[]((* &((boost::_bi::list3 (*)) は変換できません()、boost::_bi::value、boost::arg<2> ()()> )this)->boost::_bi::list3 (*)(), boost::_bi::value, boost::arg<2> (*)()>::.boost::_bi ::storage3 (*)()、boost::_bi::value、boost::arg<2> (*)()>::.boost::_bi::storage2 (*)()、boost:: bi ::value >::a2 ))' (タイプ 'iodata*') をタイプ 'const boost::system::| \boost\bind\mem_fn_template.hpp|291|注: テンプレート R boost::_mfi::mf2::operator()(const U&, A1, A2) const [with U = U; R = ボイド; T = ioclient; A1 = const boost::system::error_code&; A2 = iodata*]| \boost\bind\mem_fn_template.hpp|291|メモ: テンプレート引数の推定/置換に失敗しました:| \boost\bind\bind.hpp|392|注: '(& a)->boost::_bi::list2::operator[]((* &((boost::_bi::list3 (*)) は変換できません(), boost::_bi::value, boost::arg<2> ( )()>)this)->boost::_bi::list3 (*)(), boost::_bi::value, boost::arg<2> (*)()>::.boost::_bi::storage3 ( *)()、boost::_bi::value、boost::arg<2> (*)()>::.boost::_bi::storage2 (*)()、boost:: bi::value > ::a2 ))' (タイプ 'iodata*') からタイプ 'const boost::system::| \boost\bind\mem_fn_template.hpp|299|注: R boost::_mfi::mf2::operator()(T&, A1, A2) const [with R = void; T = ioclient; A1 = const boost::system::error_code&; A2 = iodata*]| \boost\bind\mem_fn_template.hpp|299|注: 'const boost::system::error_code' から 'ioclient&' への引数 1 の既知の変換はありません|
私はバインドで何か間違ったことをしていると確信していますが、それが何であるかについて途方に暮れています。何か案は?