【问题标题】:How to create map of scoped_ptr in c++如何在 C++ 中创建 scoped_ptr 的映射
【发布时间】:2015-11-09 11:26:17
【问题描述】:

我有以下代码,第 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_ptrstd::unique_ptr ? C++11 ?
  • 如果你无法访问 c++11,请使用 boost::ptr_container。它可以满足您的需求。

标签: c++ dictionary scoped-ptr


【解决方案1】:

你不能,boost::scoped_ptr 在设计上就是 non-copyable(强调我的):

scoped_ptr 模板是满足简单需求的简单解决方案。它提供了一个基本的“资源获取即初始化”工具,没有共享所有权或所有权转移语义。它的名称和语义的实施(不可复制)都表明它打算仅在当前范围内保留所有权。

<...>

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

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

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

【讨论】:

  • 这是否意味着作用域指针不能用于容器?
  • @mlmostafa,是的,文档中明确说明不能在标准库容器中使用它
  • @SingerOfTheFall 我认为您需要进一步澄清这一点。它们可以使用,您只需要小心移动/放置scoped_ptrs,而不是复制它们。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 2020-10-26
    • 2014-09-20
    • 1970-01-01
    • 2017-05-31
    • 2012-11-15
    • 2012-03-29
    • 2023-04-08
    相关资源
    最近更新 更多