2016-11-23 89 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;

相关问题