gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:40:08 25 4
gpt4 key购买 nike

我在 map 值中使用 unique_ptr。我需要将这些值作为原始指针的列表/vector 获取。到目前为止,我已经做了如下。

#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: note: cannot convert ‘std::forward((* & __args#1))’ (type ‘Foo*’) to type ‘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

最佳答案

您得到的错误是因为 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

关于c++ - 从映射值中的 unique_ptr 迭代原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com