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 compilation

    Ich 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>::iterator sowohl ein Typname als auch ein Funktionsname sein. Um diese mehrdeutige Situation zu vermeiden, nimmt der Compiler an, dass std::vector<T>::iterator kein Typname ist. Erst mit dem Schlüsselwort typename suggerierst 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>::iterator von T abhängig ist. Wäre es das nicht, wäre ja schon vorher klar, was iterator ist.



  • @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".


Anmelden zum Antworten