マップ値にunique_ptrを使用しています。私はそれらの値を生ポインタのリスト/ベクトルとして取得する必要があります。これまで私は以下のようにしてきました。マップ値の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;
}
しかし、これはコンパイルに失敗します。注意:前方:: 「STD((* & __args番号を変換することはできません最もreleventエラーメッセージが
「/usr/include/c++/4.8/bits/stl_tree.h:140:49のようです1)) '(タイプ 'はFoo * constの のstd :: & unique_ptrを「」
')を入力し' しかし、私は私の理解は、そのit.second戻っているので、私はそれが何を意味するのか理解してわかりませんunique_ptrへの参照ではなく、Fooインスタンスではなく、問題がどこにあるかを自分自身で仮定します。この例を修正するために何をする必要がありますか?
私は若干古いg ++バージョンを使用しています。コマンドラインで
グラム++(Ubuntuの〜14.04.3 4.8.4-2ubuntu1)4.8.4
。
グラム++ -std = C++ 11 -oユニークunique.cpp
私のためにコンパイルしてください。 'g ++(GCC)6.1.1 20160602'、余分なフラグはありません。興味深い。 – Thomas
だから、コンパイラのバグかもしれない?コンパイラの詳細を追加しました。 – chamibuddhika
Clang ++もそれを受け入れます( '-std = C++ 11'が与えられたとき)。 'clang version 3.8.0(tags/RELEASE_380/final'。 – Thomas