2010-09-17 6 views
0

Ceci est la déclaration de l'ISO C++ standard 14,6/6:Modèles: Résolution de noms -> EST cette déclaration est vraie tant que l'héritage?

Dans la définition d'un modèle de classe ou dans la définition d'un membre d'un modèle de classe, le mot-clé typename n'est pas nécessaire en se référant à des personnes non qualifiées nom d'un membre précédemment déclaré du modèle de classe qui déclare un type. Le mot clé typename doit toujours être spécifié lorsque le membre est référencé à l'aide d'un nom qualifié, même si le qualificatif est simplement le nom du modèle de classe. [Exemple:

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 
}; 

Le typename mot-clé est nécessaire si le nom qualifié est A ou A<T> parce A ou A<T> sont synonymes dans un modèle de classe avec la liste des paramètres <T>. ]

Est-ce que cette déclaration est vraie pendant l'héritage?

Si oui, quelqu'un peut-il expliquer cela?

J'ai vérifié avec classe interne; c'est accepté? Mais je suis incapable de vérifier avec l'héritage?

+0

Peut-être pourriez-vous développer votre question avec quelques exemples; Je ne pense pas que ce soit très clair comme indiqué (je ne comprends certainement pas ce que vous demandez). (En outre, je pense que vos commentaires dans le texte cité peuvent être dans le mauvais sens, ils n'ont pas de sens où ils sont actuellement placés.Je n'ai pas de PDF de la norme à portée de main pour vérifier). –

+0

ISO/IECINTERNATIONAL STANDARD 14882 Deuxième édition 2003-10-15 Les langages de programmation - C++ Langages de programmation - C++ –

+0

@BES: Je suppose que vous avez essayé de poster un lien mais ne pouvait pas parce que vous n'avez pas assez points. C'est une bonne chose, car pirater la norme sur ce site ne serait pas cool. – Potatoswatter

Répondre

1

Oui, cela est également vrai pour les membres hérités.

Le mot-clé typename est requis pour les membres de la base modèles, mais pas les classes de base en général. La raison pour laquelle il est requis pour les modèles de base est que leurs membres ne sont pas automatiquement inclus dans la portée du bloc class {}, donc la seule façon de s'y référer est avec un ID qualifié, qui nécessite 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; 
};