Template und Iterator
-
Guten Abend.
Ich wollte einmal etwas mit Iteratoren rumspielen und habe dann gedacht, ich koennte gleich mal versuchen Binary Search rekursiv zu implementieren.
Ich habe nun folgenden Code:
template<typename T> std::vector<T>::iterator binary_search( std::vector<T> & data, T element, std::vector<T>::iterator left, std::vector<T>::iterator right ) { return 0; }Das return 0; ist nur, damit der Compiler sich nicht beschwert, dass ein return fehlt. Ich bekomme allerdings diese Fehlermeldungen:
BinarySearch.h(35): error C2146: syntax error : missing ';' before identifier 'binary_search'
BinarySearch.h(35): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
BinarySearch.h(35): error C3860: template argument list following class template name must list parameters in the order used in template parameter list
BinarySearch.h(35): fatal error C1903: unable to recover from previous error(s); stopping compilationIch sehe (mit meinen mueden Augen) den Fehler nicht. Kann mir da jemand helfen?
-
vor std::vector<T>::iterator muss "typename".
-
Ja, das klappt

Ich verstehe allerdings warum ich das 'template' dort hin muss. Kannst du mir das erklaeren?
-
icarus2 schrieb:
Ich verstehe allerdings warum ich das 'template' dort hin muss. Kannst du mir das erklaeren?
Was meinst du damit

-
Da bei der Übersetzung die Instantiierung von T noch nicht bekannt ist, kann
std::vector<T>::iteratorsowohl ein Typname als auch ein Funktionsname sein. Um diese mehrdeutige Situation zu vermeiden, nimmt der Compiler an, dassstd::vector<T>::iteratorkein Typname ist. Erst mit dem Schlüsselworttypenamesuggerierst du, dass der gegebene Name ein Typname ist.
-
Habe das falsche Wort genommen

Ich wollte fragen, warum das 'typename' vor std::vector<T>::iterator hin muss.
*Edit
@ Hacker
Achso, dann sage ich also mit dem 'typename' vor std::vector<T>::iterator, dass std::vector<T>::iterator ein Typ und keine Funktion ist?
-
icarus2 schrieb:
Habe das falsche Wort genommen

Ich wollte fragen, warum das 'typename' vor std::vector<T>::iterator hin muss.
*Edit
@ Hacker
Achso, dann sage ich also mit dem 'typename' vor std::vector<T>::iterator, dass std::vector<T>::iterator ein Typ und keine Funktion ist?Juchuu!
-
Alles klar. Danke euch beiden

-
Ich kann es nicht so richtig erklären, aber vielleicht hilft das: http://pages.cs.wisc.edu/~driscoll/typename.html
-
Ach ganz kurz noch: das ist so, weil
std::vector<T>::iteratorvonTabhängig ist. Wäre es das nicht, wäre ja schon vorher klar, wasiteratorist.
-
@pyhax:
Der Artikel erklaert ziemlich gut warum es das typename braucht, thx.@Hacker:
Jup, das nennt man offenbar (steht in dem Artikel oben) einen "qualified dependent type".