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