2016-11-11 3 views
0

У меня есть код в виде:C++: Как получить тип итератора из определенного объекта контейнера

unordered_set<pair<int,int>,CustomHash> Edges; 
typedef unordered_set<pair<int,int>,CustomHash>::iterator EdgesIt; 
... 
for(auto it=Edges.begin();it!=Edges.end();it++){ 
    list<EdgesIt> List; 
} 

и т.д. Как я могу избежать определения нового типа EdgesIt, которые будут использоваться в объявлении списка и получить его в некоторые разумный способ, например: предлагает только

list<Edges::iterator_type> List; 

InteliSense Edges::iterator который определяется как typedef std::iterator pair<int,int> iterator. Более того, это не работает. Я также пытался использовать unordered_set::iterator, но он также не работает.

+1

«Это не работает» не является полезным описанием проблемы. 'typedef Edges :: iterator EdgesIt;' правильный. –

ответ

5

Edges - это имя объекта, а не имя класса (и пространства имен и т. Д.). Вы не можете получить вложенный typedef из него прямо как Edges::iterator.

Вы можете использовать decltype (начиная с C++ 11), чтобы получить нужный тип (т. Е. unordered_set<pair<int,int>,CustomHash>). например

list<decltype(Edges)::iterator> List; // same as list<unordered_set<pair<int,int>,CustomHash>::iterator> List;