über zwei vectoren gleichzeitig iterieren?
-
oke, werd ich mal suchen...
direkte folgefrage:
warum kann ich in einer template-funciton sowas nicht machentemplate<class T> void mean_deviation(const std::vector<T> & data , T & mean , T & deviation ) { ... for(std::vector<T>::iterator current_data_point = data.begin(); current_data_point != data.end() ; ++ current_data_point){ .. } ...also der iterator kann so nicht da stehen....
-
da fehlt ein typename:
typename std::vector<T>::iterator
-
Weil der Compiler nicht weiß, ob
iteratoreine Funktion oder ein Typ ist. Dastd::vector<T>::iteratorhier von T abhängig ist, ist es ein dependent name/type.Da der Compiler nun nicht weiter weiß, nimmt er an, dass
iteratoreine Membermethode ist. Was in einen Compiler-Fehler resultiert.Lösung:
Davor muss also ein**typename**(was genau das zurechtbiegt).
-
vielen Dank ,
auch das muss ich zu meiner schande gestehen wusste ich einfach nicht...
heisst das jeder vom template abhängige typ muss nach typedef stehen?
-
M10n schrieb:
heisst das jeder vom template abhängige typ muss nach typedef stehen?
Du meinst
typename.Ja.
-
ahh , perfekte erklärung, typename also. Vielen Dank, werde ich nicht mehr vergessen.

-
Nimm doch bitte einfach auto...
-
Kellerautomat schrieb:
Nimm doch bitte einfach auto...
wenn dein Compiler C++11 kann und es aktiviert ist.
-
Mir ist kein Commpiler bekannt, der auto nicht schon hat...
-
Kellerautomat schrieb:
Mir ist kein Commpiler bekannt, der auto nicht schon hat...
Und wie ist es bei dir mit Versionen?
-
Wie meinen?
-
Kellerautomat schrieb:
Wie meinen?
Je nach dem, unterstützt die Version seines Compilers die er installiert hat (vielleicht hat er ja GCC 4.4 oder so) automatic type deduction vielleicht noch nicht

-
Dann ist er aber selbst Schuld. Soll er halt updaten.
-
Also ich finde diese Diskussion über C++11 ein wenig verwunderlich. Es gibt Situationen, da kann man nicht einfach so mal schnell updaten. Im professionellen Bereich ist es üblich, gut abgehangene Software zu verwenden. Und das sehr lange. Bis ich mal auf der Arbeit C++11 verwenden kann, wird wohl noch 2-3 Jahre vergehen.
Bei uns wird der Compiler nicht einfach mal aktualisiert. Das geschieht nur, wenn die Hardware mal erneuert wird.
Man denke auch mal an Red Hat Linux oder andere Linux Distributionen, die länger gewartet werden. Da wird auch noch Software entwickelt.
-
Der TE ist offensichtlich keinprofessioneller Softwareentwickler...
-
versuchs mal so:
typename std::vector<int>::iterator it1 = vec1.begin(); // auto it1 = vec1.begin(); typename std::vector<char>::iterator it2 = vec2.begin(); // auto it2 = vec2.begin(); for (; it1 != vec1.end() && it2 != vec2.end(); ++it1, ++it2) std::cout << *it1 << ", " << *it2 << std::endl;Die Anforderung, dass es der gleiche Typ und die gleiche Größe sein muss ist
Quatsch.Kellerautomat schrieb:
Der TE ist offensichtlich keinprofessioneller Softwareentwickler...
Kein Grund, trotzdem sollte man sowohl C++11 als auch C++03 zu kennen.
-
M10n schrieb:
wenn man das nicht gewusst hat und immer ausgeschrieben hat fühlt das sich wie betrug an.
Naja, so lange gibt's das auch nicht. Erst seit einem Jahr.
Es ist ein C++2011 Feature.
-
Kellerautomat schrieb:
Der TE ist offensichtlich keinprofessioneller Softwareentwickler...
ne isser nicht.

allerdings bin ich trotzdem an die compiler gebunden die mir das rz auf den rechenknechten und lokal mein arbeitsrechner bietet. und das ist im einen fall ein mac mit 4.2.1 und sonst 4.4.5. deswegen geht auto bei dem problem nicht.
aber trotzdem gut die ganzen leckeren neue(re)n features zu kennen.Cyres schrieb:
Die Anforderung, dass es der gleiche Typ und die gleiche Größe sein muss ist
Quatsch.danke , dachte ich mir und hab ich jetzt auch schon anders gemacht. ich kannte die syntax mit dem komma nicht.
-
Der Kommaoperator ist auch ungerne gesehen.
man kann es auch so schreiben: (ungetestet)typename std::vector<int>::iterator it1 = vec1.begin(); // auto it1 = vec1.begin(); typename std::vector<char>::iterator it2 = vec2.begin(); // auto it2 = vec2.begin(); while (it1 != vec1.end() && it2 != vec2.end()) { std::cout << *it1 << ", " << *it2 << std::endl; ++it1; ++it2: }
-
Cyres schrieb:
Der Kommaoperator ist auch ungerne gesehen.
hat der ausser unübersichtlichkeit sonst noch nachteile?