如何在c ++中创建scoped_ptr的映射

时间:2015-11-09 11:26:17

标签: c++ dictionary 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

2 个答案:

答案 0 :(得分:1)

你不能,boost::scoped_ptrnon-copyable的设计(强调我的):

  

scoped_ptr模板是满足简单需求的简单解决方案。它提供了一个基本的&#34;资源获取初始化&#34;设施,没有共享所有权或所有权转移语义。它的名称和语义强制执行(通过不可复制)表明其意图仅在当前范围内保留所有权。

     

&LT; ...&GT;

     

scoped_ptr不能在C ++标准库容器中使用。如果您需要可以使用的智能指针,请使用shared_ptr。

但是,您可以将安置 shared_ptr放入容器中,因为在这种情况下不会执行复制:

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

答案 1 :(得分:0)

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

但是,我建议你不要这样做。