在地图值

时间:2016-07-06 17:55:55

标签: c++ c++11 smart-pointers

我在地图值中使用unique_ptr。我需要将这些值作为原始指针的列表/向量。到目前为止,我做了如下。

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <map>

class Foo {
  public:
    std::string val;

    Foo(std::string v) : val(v) {
    }
 };

 class Unique {
   public:
     std::map<int, std::unique_ptr<Foo>> unique_map;

     std::vector<Foo*> getFoos() {
       std::vector<Foo*> foos;
       for (auto& it : unique_map) {
         foos.push_back(it.second.get());
       }

       return foos;
     }
 };

 int main() {
   Unique unique;
   Foo* f1 = new Foo("1");
   Foo* f2 = new Foo("2");

   unique.unique_map.emplace(1, f1);
   unique.unique_map.emplace(2, f2);

   std::vector<Foo*> foos = unique.getFoos();

   for (Foo* foo : foos) {
     std::cout << foo->val;
   }

   std::cout<<"\n";

   return 0;
 }

但这无法编译。最相关的错误消息似乎是

  

&#34; / usr / include / c ++ / 4.8 / bits / stl_tree.h:140:49:注意:无法转换   'std :: forward((*&amp; __args#1))'''type'Foo *')输入'const   的std ::的unique_ptr&安培;”&#34;

但我不确定我的理解是什么意思,因为我的理解是 it.second 返回对unique_ptr的引用而不是它自己的Foo实例假设问题出在哪里。需要做些什么来修复这个例子?

修改 我使用的是较旧的g ++版本。

  

g ++(Ubuntu 4.8.4-2ubuntu1~14.04.3)4.8.4

使用命令行。

  

g ++ -std = c ++ 11 -o unique unique.cpp

2 个答案:

答案 0 :(得分:1)

当我运行此代码时,投诉似乎与std::pair类的创建有关。

unique.unique_map.emplace(1, std::unique_ptr<Foo>(f1));
unique.unique_map.emplace(2, std::unique_ptr<Foo>(f2));

对我而言,这构建并且它有效,而不是我可以肯定地说它会真正做你想要的。只是它为我编译并运行。

我花了大部分时间使用QT库和类,但是,我觉得它没有找到一种方法将FOO*转换为unique_ptr<FOO>

答案 1 :(得分:1)

您获得的错误是因为不允许将Foo*隐式转换为std::unique_ptr<Foo>。这是因为,unique_ptr采用原始指针的构造函数标记为explicit

explicit
      unique_ptr(pointer __p) noexcept
      : _M_t(__p, deleter_type())
      { static_assert(!is_pointer<deleter_type>::value,
                     "constructed with null function pointer deleter"); }

因此,您应该在执行unique_ptr时创建moveemplace

注意:我不确定它在g ++中工作的原因或方式&gt; 6.0库。但就我个人而言,我并不认为将原始指针隐式转换为智能指针是安全的。要了解原因,请参阅:https://stackoverflow.com/a/11367997/434233