맵 값에 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;
}
그러나 컴파일이 실패합니다. 주의 : 관련된 가장 중요한 오류 메시지가
는 "/usr/include/c++/4.8/bits/stl_tree.h:140:49 것으로 보인다 을 변환 할 수 없습니다 '표준 앞으로 :: ((* & __args 번호 1)) '(유형'푸 * const를 표준 : & unique_ptr ' "
')을 입력합니다 '하지만 내 이해가 it.second 반환이기 때문에 나는 그것이 무슨 뜻인지 확실하지 않다 unique_ptr에 대한 참조는 Foo 인스턴스가 아니라 문제가있는 것으로 가정합니다. 이 예제를 수정하기 위해 수행해야 할 작업은 무엇입니까?
편집 다소 나이가 많은 g ++ 버전을 사용하고 있습니다.
그램 ++ (~ 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