Domanda

Questa è la dichiarazione da ISO C ++ standard 14,6 / 6:

  

All'interno della definizione di un modello di classe o nella definizione di un membro di una classe template, la parola chiave typename non è necessaria quando ci si riferisce al nome non qualificato di un membro precedentemente dichiarato del modello di classe che dichiara un tipo. La typename parola chiave deve sempre essere specificato quando il membro è indicato con un nome qualificato, anche se la qualificazione è semplicemente il nome modello di classe. [ Esempio:

template<class T> struct A {
    typedef int B;
    A::B b;             // ill-formed: typename required before A::B
    void f(A<T>::B);    // ill-formed: typename required before A<T>::B
    typename A::B g();  // OK
};
     

Il typename parola chiave è necessaria se il nome qualificato è A o A<T> perché A o A<T> sono sinonimi all'interno di un modello di classe con la lista dei parametri <T>. ]

E 'questa affermazione è vera eredità, mentre?

Se sì, qualcuno può spiegare questo?

Ho controllato con classe interna; è accettato? Ma io sono in grado di controllare con eredità?

È stato utile?

Soluzione

Sì, questo vale anche per i membri ereditati.

Il typename parola chiave è necessario per i membri della base di Modelli , ma le classi non di base in generale. Il motivo è necessaria per i modelli di base è che i loro membri non sono riportare automaticamente la portata del blocco class {}, quindi l'unico modo per riferirsi a loro è un qualificato-id, che richiede typename.

template< typename >
class base1
    { typedef int type1; };

class base2 
    { typedef int type2; };

template< typename A >
class derived
    : base1< A >, base2 {
    typename base1< A >::type1 x;
    type2 y;
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top