Ich verwende unique_ptr in Kartenwerten. Ich muss diese Werte als eine Liste/einen Vektor von rohen Zeigern erhalten. Bisher habe ich Folgendes getan.Iterate rohe Zeiger von unique_ptr in Kartenwerte
#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;
}
Aber das kompiliert nicht. Die relevent Fehlermeldung scheint
„/usr/include/c++/4.8/bits/stl_tree.h:140:49 zu sein: Hinweis: nicht ‚std :: Vorwärts umwandeln kann ((* & __args # 1)) '(Typ 'Foo * const std') eingeben' :: unique_ptr & ‚“
Aber ich bin nicht sicher, ob ich verstehe, was es bedeutet, da mein Verständnis ist, dass it.second zurückkehren ein Verweis auf die unique_ptr nicht die Foo-Instanz selbst nimmt an, dass, wo das Problem ist. Was muss getan werden, um dieses Beispiel zu beheben?
Bearbeiten Ich verwende eine etwas ältere Version g ++.
g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) 4.8.4
mit Befehlszeile.
g ++ -std = C++ 11 -o einzigartig unique.cpp
Kompiliert für mich. 'g ++ (GCC) 6.1.1 20160602', keine zusätzlichen Flags. – Thomas
Interessant. Also könnte es ein Compiler Bug sein? Habe gerade meine Compilerdetails hinzugefügt. – chamibuddhika
Clang ++ akzeptiert es auch (wenn "-std = C++ 11" angegeben). 'clang Version 3.8.0 (tags/RELEASE_380/final'. – Thomas