Wozu zus. "typename" in Template-Klasse-Definition?



  • Hallo,
    kann mir wer sagen, wann man ein extra "typename" in der Definition einer Template-Klasse braucht?
    Ich habe das öfters gesehen, weiß aber nicht wozu das gut sein soll:

    template<typename T>
    class c
    {
    
        typename xyz ...
    
    };
    

    LG
    ULong



  • Brauchst du nur bei namedependet namelookup, also z.B.:

    template <typename T> void func()
    {
        typename T::asdf var = 5;
    }
    

    Der Grund dafür ist wohl einfach, weil es im Standard steht, der Microsoft C++ Compiler verlangt typename z.B. nicht.





  • [quote=§14.6.2]A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.[/quote]
    und
    [quote=§14.6.3]When a qualified-id is intended to refer to a type that is not a member of the current instantiation (14.6.2.1) and its nested-name-specifier depends on a template-parameter (14.6.2), it shall be prefixed by the keyword
    typename, forming a typename-specifier. If the qualified-id in a typename-specifier does not denote a type, the program is ill-formed.[/quote]



  • Ich hab glaub nen Fehler drin. Das heißt "argument dependet namelookup" anstelle von "name dependet namelookup" und "dependet names" anstelle von "name dependet".



  • ..Ok, Danke Mr.L!
    Mr. Google korrigiert einen eh sofort..

    Habs auf Anhieb ehrlich gesagt nicht wirklich verstanden. Wenn du dafür etwas Zeit hättest, könntest du mir dann ein Negativ-Bsp. geben? Sowas wie "So gehts nicht, darum muss man..."

    LG
    Ulong


  • Mod

    ULong schrieb:

    Habs auf Anhieb ehrlich gesagt nicht wirklich verstanden. Wenn du dafür etwas Zeit hättest, könntest du mir dann ein Negativ-Bsp. geben? Sowas wie "So gehts nicht, darum muss man..."

    template <typename T> void foo()
    {
      T::bar * b;  // Definition eines Pointers oder eine Multiplikation?
    }
    


  • Sobald ein typename von einem Argument abhängt, benötigst du ein typename.
    Im Fall von

    template <typename T> void func()
    {
        typename T::asdf var = 5;
    }
    

    hängt asdf vom Argument T ab, weshalb du ein typename brauchst.
    Wärend hier:

    struct A { typedef int asdf; };
    void func()
    {
        A::asdf var = 5;
    }
    

    asdf unabhängig von einem Argument ist (laut definition argument independent), weshalb du hier auch kein typename benötigst.



  • Ah ok, das leuchtet natürlich ein! Ich danke euch.

    LG
    ULong


Log in to reply