2016-11-23 68 views
0

使用Boost綁定使用Boost獨特的指針和Boost函數我正在接收鏈接器錯誤,具體取決於我如何將回調傳遞給接收函數。
如果我通過綁定包含boost唯一指針參數的回調來創建Boost函數成員變量,並將其傳遞給接收函數,則當調用回調時嘗試使用唯一指針時會導致鏈接器錯誤。使用Boost時的鏈接器錯誤使用Boost綁定和Boost函數的唯一指針

如果我在調用接收函數時執行綁定,我不會收到鏈接器錯誤,並且代碼的行爲與預期相同。

示例代碼:

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一起使用的信息。但如果這是真的,我會期望這兩種方法綁定並傳遞包含唯一指針的回調失敗。

回答

0

message類必須具有明確聲明的刪除者 至少〜message()= default;