ブースト専用ブースト機能付きのブーストバインドの使用ユニークなポインタおよびブースト機能受信機能にコールバックを渡す方法によってリンカエラーが発生します。
ブースト一意のポインタparamを含むコールバックをバインドしてブースト関数メンバ変数を作成し、これを受信関数に渡すと、コールバックが呼び出されたときに一意のポインタを使用しようとするとリンカエラーが発生します。ブースト使用時のリンカエラーブーストバインドおよびブースト機能付きユニークポインタ
受信機能を呼び出すときにバインドを実行すると、リンカエラーが発生せず、コードが期待どおりに動作します。
サンプルコード:
class test
{
public:
test() : callback_(boost::bind(&test::callback, this, _1, _2))
void start()
{
// using boost function pointer,
// this fails with linker errors
accept(callback_); // (Method 1)
// using in place bind
// this is OK
accept(boost::bind(&test::callback, this, _1, _2)); // (Method 2)
}
void callback(BOOST_RV_REF(boost::movelib::unique_ptr<message>) message,
int version)
{
// attempting to use message if implemented as (Method 1) will result in linker errors
message->get_body(); // If I comment out this line then both methods compile and link???
}
boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) > callback_;
};
class callback_tester
{
callback_tester(){};
void accept(boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) callback)
{
// Assignment to local member variable is fine here so we
// can invoke the callback at a later stage.
test_callback_ = callback;
test_callback_(boost::move(message_), version_);
}
// define handler to store and invoke test callback
boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) > test_callback_;
boost::movelib::unique_ptr<message> message_;
int version_;
};
次のようにリンカエラーのいくつかは、次のとおりです。
Error: symbol `_ZN5boost8functionIFvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEEED2Ev' is already defined
Error: symbol `_ZN5boost9function2IvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEED2Ev' is already defined
Error: symbol `_ZNSt15binary_functionIRKN5boost6system10error_codeERNS0_2rvINS0_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEvEC2Ev' is already defined
...
誰もが二つの方法の違いは、なぜリンカエラーがときにのみ表示されるものを教えてもらえます方法1が使用されているときに一意のポインタにアクセスしようとしていますか?
私は、コールバックがCopyConstructibleでboost :: functionと一緒に使用する必要があることについていくつかの情報を知りました。しかし、それが真実ならば、両方のメソッドが一意のポインタを含むコールバックをバインドして渡して失敗することが予想されます。