Boost:: shared_ptr:: shared_ptr (const boost:: shared_ptr &) 'неявно объявляется как удаленный

#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 - Скомпилировать и выполнить С++ 11 Online (версия GNU GCC 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

Вопроs > Я видел сообщение Использование std:: shared_ptr с clang++ и libstdС++. Однако я не знаю, как это исправить.

Решение, размещенное в этом вопросе, заключается в следующем: "Добавление конструктора копии по умолчанию и оператора назначения копирования в shared_ptr устранит проблему".

Ответы

Ответ 1

Это ошибка в старых версиях boost::shared_ptr, что делает ее несовместимой с компиляторами С++ 11.

В последнем стандарте на С++ 11 говорится, что объявление конструктора перемещения или оператора присваивания перемещения предотвращает неявное определение конструктора копирования, но более старые версии boost::shared_ptr не соблюдают это правило и предполагают, что конструктор копирования будет неявным определены.

Вам либо нужно перейти на Boost версии 1.48 или новее, либо отредактировать заголовки Boost, чтобы добавить это в shared_ptr:

shared_ptr(const shared_ptr&) = default;