словарь — Как создать карту scoped_ptr в переполнении стека

У меня есть следующий код и строка 2 дает мне ошибку во время компиляции. Можно ли создать карту указателей с областью действия или я должен вместо этого использовать общие указатели?

map<int, scoped_ptr> mp;
mp[1] = scoped_ptr(new obj());

ошибка:

boost::scoped_ptr<T>& boost::scoped_ptr<T>::operator=(const boost::scoped_ptr<T>&) [with T = ]’ is private

3

Решение

Ты не можешь, boost::scoped_ptr является без копируемыми по дизайну (акцент мой):

Шаблон scoped_ptr — это простое решение для простых нужд. Он предоставляет базовую возможность «приобретение ресурсов — инициализация» без семантики совместного владения или передачи права собственности. И его название и применение семантики (будучи не копируемым) сигнализировать о своем намерении сохранить право собственности исключительно в рамках текущей области.

<…>

scoped_ptr нельзя использовать в контейнерах стандартной библиотеки C ++. Используйте shared_ptr, если вам нужен умный указатель, который может.

Вы можете, однако, устанавливать shared_ptrs в контейнер, так как в этом случае копирование не выполняется:

std::list<boost::scoped_ptr<MyClass>> list;
list.emplace_back(new MyClass());
1

Другие решения

boost::scoped_ptr не подлежит копированию, но вы все равно можете поменять его.

Вот трюк:

// Example program
#include <iostream>
#include <string>
#include <map>
#include <boost/scoped_ptr.hpp>

int main()
{
std::map<int, boost::scoped_ptr<int>> myMap;

int * test = new int();
*test = 589;

boost::scoped_ptr<int> myScoped(test);

boost::swap(myMap[1], myScoped);

std::cout << *myMap[1];

}

Дает:

589

Смотрите на C ++ Shell: http://cpp.sh/3zm3

Тем не менее, я советую вам не делать этого.

0

По вопросам рекламы [email protected]