Unterschied zwischen "typename" und "class"?



  • Hi Leute!

    Ich beschäftige mich neben bei ein bischen mit Template-Funktionen und Template-Klassen, sprich ich bringe mir gerade bei wie's funktioniert. Nun bin ich aber auf folgendes gestoßen und würde gerne wissen wo der Unterschied ist:

    Es gibt für Templates ja folgende Arten der Definition
    [cpp]template<typename T> T foo() { //... }[/cpp]
    und

    template<class T> T bar() { //... }
    

    In einem Buch hab ich gelesen das "class" veraltet sei. Auf einer Inet-Page hingegen habe ich gelesen das beides gleichwertig ist, "typename" aber nur eingeführt wurde um zu verdeutlichen das hier nicht nur Klassen sondern alle Typen verwendet werden können.

    Was davon stimmt und wo liegt denn da jetzt der Unterschied zwischen "typename" und "class"??

    Thx im voraus 🙂



  • Hallo,

    es gibt keinen Unterschied. In der Tat ist es so, dass man 'class' als
    veraltet ansieht. Warum, kann ich allerdings nicht sagen.

    mfg
    v R



  • Irgendwie stimmen beide Aussagen.
    class und typename sind an dieser Stelle gleichwertig.
    typename wurde später eingeführt um zu beschreiben, daß dort auch einfache Typen stehen können. Typename beschreibt die Absicht eben genauer. Aber vom Effekt her kommt es bei beiden auf das Selbe hinaus.

    Alexandrescu benutzt meines Wissens folgende Konvention:

    typename: wenn alle möglichen Typen erlaubt sind
    class: wenn das template nur für die Instanziierung mit Klassen gedacht ist (zum Beispiel Policies).

    MfG Jester



  • Verstehe! Danke für die Info 🙂



  • Wenn eine Template-Klasse von einem weiteren Template-Parameter abhänig ist, muss vor dem Datentyp typename stehen:

    template<class T>
    void foo(std::vector<T>&, typename std::vector<T>::iterator) { }
    
    template<class T>
    void foo(T&, typename T::iterator, typename T::iterator) { }
    

    Mit class wirst du in einem solchen Fall kein Glück haben.


Anmelden zum Antworten