c++ - boost::shared_ptr::shared_ptr(const boost::shared_ptr&)' 被隐式声明为已删除

标签 c++ boost c++11

#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 将解决问题。”

最佳答案

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

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

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

shared_ptr(const shared_ptr&) = default;

关于c++ - boost::shared_ptr::shared_ptr(const boost::shared_ptr&)' 被隐式声明为已删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18900730/

相关文章:

c++ - 使用 "kmk packing"创建 VirtualBox 包失败并出现错误 127

c++ - 如何指定继承类的构造函数定义?

c++ - C++ 和 Grep 之间二进制到 ASCII 的不同?

python - Boost.Python 和错误 LNK1104 : cannot open file 'boost_python-vc100-mt-gd-1_55.lib'

c++ - 赋值运算符是否应该观察被赋值对象的右值?

c++ - 如何在C++中独立生成多个随机数序列?

c++ - 为什么我们需要构建一个 boost 库,仅仅包含头文件还不够吗,因为 boost 是模板

multithreading - boost ASIO IO_SERVICE 实现?

c++11 - std::move() 只是类型转换?

c++ - 如何在 bazel BUILD 文件中指定 -std=c++11 选项?