【问题标题】:boost::shared_ptr::shared_ptr(const boost::shared_ptr&)' is implicitly declared as deletedboost::shared_ptr::shared_ptr(const boost::shared_ptr&)' 被隐式声明为已删除
【发布时间】:2013-09-24 21:28:51
【问题描述】:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;

struct Node
{
    Node(int data, boost::shared_ptr<int> next = boost::make_shared<int>())
      : m_data(data), m_next(next) {}

    int m_data;
    boost::shared_ptr<int> m_next;    
};

错误: http://www.compileonline.com/compile_cpp11_online.php - 在线编译和执行C++11(GNU GCC version 4.7.2)

Compiling the source code....
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1
main.cpp: In constructor 'Node::Node(int, boost::shared_ptr)':
main.cpp:9:34: error: use of deleted function 'boost::shared_ptr::shared_ptr(const boost::shared_ptr&)'
In file included from /usr/include/boost/shared_ptr.hpp:17:0,
from main.cpp:2:
/usr/include/boost/smart_ptr/shared_ptr.hpp:168:25: note: 'boost::shared_ptr::shared_ptr(const boost::shared_ptr&)' is implicitly declared as deleted because 'boost::shared_ptr' declares a move constructor or move assignment operator

问题> 我看到了Using std::shared_ptr with clang++ and libstdc++ 的帖子。但是,我不知道如何解决它。

该问题中发布的解决方案是“将默认的复制构造函数和复制赋值运算符添加到 shared_ptr 将解决问题。”

【问题讨论】:

  • 听起来你有一个错误版本的 Boost。是否可以选择禁用 C++11 支持,或者改用 std::shared_ptr?

标签: c++ boost c++11


【解决方案1】:

这是boost::shared_ptr 旧版本中的bug,使其与 C++11 编译器不兼容。

最终的 C++11 标准规定,声明移动构造函数或移动赋值运算符可防止复制构造函数的隐式定义,但 boost::shared_ptr 的旧版本不遵守该规则并假设复制构造函数将隐式已定义。

您要么需要升级到 Boost 版本 1.48 或更高版本,要么编辑 Boost 标头以将其添加到 shared_ptr:

shared_ptr(const shared_ptr&) = default;

【讨论】:

  • 至少对于boost 1.46.1,你只需要添加复制构造函数即可。第二行定义 operator= 会产生编译错误,因为 boost 明确定义了赋值运算符。
  • 在 Precise 上更新到 Boost 1.48 为我解决了这个问题。它位于默认系统存储库中,因此您可以假设它是稳定的。不看代码,我怀疑 1.48 是最早修复的版本。
  • @Elkvis,谢谢。我刚刚检查了 1.47.0 和 1.48.0 版本中的代码,修复出现在 1.48.0 中,所以我更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-09-27
  • 2013-06-12
  • 2013-04-16
相关资源
最近更新 更多