【问题标题】:Linker errors when using Boost Unique pointer with Boost Bind and Boost Function将 Boost Unique 指针与 Boost Bind 和 Boost Function 一起使用时出现链接器错误
【发布时间】:2016-11-23 13:27:38
【问题描述】:

将 Boost Bind 与 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 一起使用。但如果这是真的,我希望这两种方法都绑定并传递一个包含唯一失败指针的回调。

【问题讨论】:

    标签: c++ boost unique-ptr boost-bind boost-function


    【解决方案1】:

    message 类必须有一个显式声明的删除器 至少 ~message() = 默认;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多