У меня есть следующий код и строка 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
Ты не можешь, boost::scoped_ptr
является без копируемыми по дизайну (акцент мой):
Шаблон scoped_ptr — это простое решение для простых нужд. Он предоставляет базовую возможность «приобретение ресурсов — инициализация» без семантики совместного владения или передачи права собственности. И его название и применение семантики (будучи не копируемым) сигнализировать о своем намерении сохранить право собственности исключительно в рамках текущей области.
<…>
scoped_ptr нельзя использовать в контейнерах стандартной библиотеки C ++. Используйте shared_ptr, если вам нужен умный указатель, который может.
Вы можете, однако, устанавливать shared_ptr
s в контейнер, так как в этом случае копирование не выполняется:
std::list<boost::scoped_ptr<MyClass>> list;
list.emplace_back(new MyClass());
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
Тем не менее, я советую вам не делать этого.