Warum brauche ich typename in folgendem Kontext?



  • struct foo
    {
        template <typename T>
        struct bar
        {
           typedef typename T::template bar<T> type; // (!)
        };
    };
    

    T ist ein Template-Parameter, ergo ist es ein Typ. Das ergibt doch gar keinen Sinn.


  • Mod

    struct foo
    {
        template <typename T>
        struct bar
        {
           typedef typename T::template bar<T> type; 
        };
    
      template <typename T>
      static void fubar()
      {
        T::template fubar<T> ();  // Hoppla, gleichartiger Ausdruck, aber nun ist's kein Typ, sondern eine Funktion.
      }
    };
    


  • Was bedeutet denn T::template ?
    Das habe ich so noch nicht gesehen 😕


  • Mod

    Lexer_ schrieb:

    Was bedeutet denn T::template ?
    Das habe ich so noch nicht gesehen 😕

    Das T:: gehört da nur bedingt dazu. Das template ist aus dem gleichen Grund da, aus dem man für abhängige Typen ein typename braucht. Der Compiler muss wissen, dass in diesem Zusammenhang bar als ein Template angesehen werden soll.



  • SeppJ schrieb:

    Lexer_ schrieb:

    Was bedeutet denn T::template ?
    Das habe ich so noch nicht gesehen 😕

    Das T:: gehört da nur bedingt dazu. Das template ist aus dem gleichen Grund da, aus dem man für abhängige Typen ein typename braucht. Der Compiler muss wissen, dass in diesem Zusammenhang bar als ein Template angesehen werden soll.

    Wird das nur im Kontext eines typedefs verwendet, oder kann diese Syntax noch irgendwo auftauchen?

    Danke



  • Die kann logischerweise überall da auftauchen, wo du ein Template aus einem "abhängigen" Namen haben willst.



  • Du brauchst diese Form (->template, .template, ::template, ...), weil der Compiler wissen muss, dass das <, was folgt, kein kleiner-als ist sondern eine template argument list.

    Standard:
    N3337 § 14.2 / 4

    When the name of a member template specialization appears after . or -> in a postfix-expression or after a
    nested-name-specifier in a qualified-id, and the object expression of the postfix-expression is type-dependent
    or the nested-name-specifier in the qualified-id refers to a dependent type, but the name is not a member of
    the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword template


Anmelden zum Antworten