std::map<x,y,z>::iterator GCC/VC,Standard?
-
Hi
Ich bin gerade dabei ein Programm von Visual C++ zu MinGW zu portieren um es anschließen plattformunabhängig mit MinGW und GCC entwickeln zu können(auch unter Linux entwickeln).
Nun bin ich gerade bei der Portierung zu MinGW, also noch unter Windows und habe bei folgender Funktion ein Problem:template<class Key, class Value, class Comparator> static Key getKeyByValue(std::map<Key, Value, Comparator> container, Value val) { for(std::map<Key, Value, Comparator>::iterator mapIter(container.begin()); mapIter != container.end(); mapIter++) if(mapIter->second == val) return mapIter->first; }Und zwar scheint er mit std::map<Key, Value, Comparator>::iterator als Typ nicht zurecht zu kommen(mit der map alleine hat er keine Probleme).
Ist dies kein Standard? Wieso beschwert sich MinGW hier und wie kann ich das beheben?
-
for (typename std::map<Key, Value, Comparator>::iterator mapIter(container.begin()); ...ich glaube mich erinnern zu können, dass in diesem kontext (ich weiß allerdings nicht mehr genau, ob genau in diesem) bestimmte GCC versionen außerdem ein
typename std::template map<Key, Value, Comparator>::iteratorwollen. (das wäre ein bug)
-
Ja, das scheint zu funktionieren.
Darf man fragen warum da ein typename hingehört?
-
Übrigens wäre die Funktion in dieser Form imho weitaus besser, da keine Kopie der map angelegt werden muss, was relativ teuer werden kann.
template<class Key, class Value, class Comparator> static Key getKeyByValue( const std::map<Key, Value, Comparator>& container, Value val) // const-Ref { for(std::map<Key, Value, Comparator>::const_iterator mapIter(container.begin()); mapIter != container.end(); mapIter++) // const-iter ... }Evtl noch eine const-Ref auf Value, aber ich meine camper hätte mal gesagt, es wäre ill-formed (oder so..):
void foo( const int& i ) {} foo2( 10 ); // ill-formed?
-
Ein typename muss dastehen, ein template darf (eigentlich) dort nicht stehen.
-
Badestrand schrieb:
Evtl noch eine const-Ref auf Value, aber ich meine camper hätte mal gesagt, es wäre ill-formed (oder so..):
void foo( const int& i ) {} foo2( 10 ); // ill-formed?da musst du wohl ein wichtiges detail übersehen haben?
btw. mit C++0x wird diese schreckliche form, mit for-schleifen arbeiten zu müssen, endlich der vergangenheit angehören:
for (auto iterator: container) { ... }
-
queer_boy schrieb:
btw. mit C++0x wird diese schreckliche form, mit for-schleifen arbeiten zu müssen, endlich der vergangenheit angehören:
for (auto iterator: container) { ... }Weißt du zufällig, ob das mit allen Containern geht, die begin() und end() anbieten?
-
Ja.
-
.filmor schrieb:
Ja.
Danke für den Link (wo auch immer ihr solche Links immer herbekommt.. :)); da freue ich mich doch wieder wahnsinnig auf das neue C++!
-
Badestrand schrieb:
.filmor schrieb:
Ja.
Danke für den Link (wo auch immer ihr solche Links immer herbekommt.. :)); da freue ich mich doch wieder wahnsinnig auf das neue C++!
Na. Von hier:
http://www.open-std.org/JTC1/SC22/WG21/Direkt an der Quelle.

-
drakon schrieb:
Na. Von hier:
http://www.open-std.org/JTC1/SC22/WG21/Direkt an der Quelle.

Cool, ist gelesezeichnet, danke!

