繁体   English   中英

从unique_ptr迭代映射值中的原始指针

[英]Iterate raw pointers from unique_ptr in map values

我在地图值中使用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;
 }

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

“ /usr/include/c++/4.8/bits/stl_tree.h:140:49:注意:无法将'std :: forward((*&__args#1))'(类型'Foo *')转换为类型'const的std ::的unique_ptr&'”

但是我不确定我理解这是什么意思,因为我的理解是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

当我运行这段代码时,抱怨似乎与std::pair类的创建有关。

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

对我而言,这种构建是有效的,并不是我可以肯定地说它将真正满足您的期望。 只是它为我编译并运行。

我大部分的C ++时间都用在QT库和类上,但是在我看来,它似乎找不到找到将带有FOO*对转换为unique_ptr<FOO>

您收到的错误是因为不允许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_ptrmove它,而这样做的emplace

注意:我不确定为什么或如何在g ++> 6.0库中工作。 但是我个人认为将原始指针隐式转换为智能指针并不安全。 要知道原因,请参阅: https : //stackoverflow.com/a/11367997/434233

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM