我在地图值中使用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
答案 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
时创建move
和emplace
注意:我不确定它在g ++中工作的原因或方式&gt; 6.0库。但就我个人而言,我并不认为将原始指针隐式转换为智能指针是安全的。要了解原因,请参阅:https://stackoverflow.com/a/11367997/434233