2017-08-19 10 views
1

Je lis Effective C++ 3rd Edition, item 43 "Savoir comment accéder aux noms dans les classes de base modélisées".Recherche de noms dans les classes de base modélisées en C++

template<typename T> 
class B { 
    T i; 
}; 

template<typename T> 
class D: public B<T> { 
public: 
    void Foo() { 
     T a = B<T>::i; 
    } 
}; 

int main() { 
    D<int> d; 
} 

Pour les codes ci-dessus, je sais si le B<T>:: n'est pas ajouté avant i dans D::Foo(), les statisticiens se plaignent « i n'a pas été déclarée dans ce champ ». (Mais il ne se plaignait pas i est privé dans B.)

Toutefois, si T i; non déclarée dans B, comme ce qui suit, la compilation va bien.

template<typename T> 
class B { 
}; 

template<typename T> 
class D: public B<T> { 
public: 
    void Foo() { 
     T a = B<T>::i; 
    } 
}; 

int main() { 
    D<int> d; 
} 

Les compilateurs sont définis par défaut pour ne pas trouver de noms dans les classes de base modélisées. Mais pourquoi ils ne font toujours pas même je leur ai dit?

Répondre

2

Mais pourquoi ils ne font toujours pas même je leur ai dit?

Parce que la fonction membre Foo n'est pas utilisé, il est pas du tout instantiated.

Cela s'applique aux membres du modèle de classe: à moins que le membre ne soit utilisé dans le programme, il n'est pas instancié et ne nécessite pas de définition.

Vous pourriez obtenir un error si Foo est appelé, comme

D<int> d; 
d.Foo(); 

BTW

Mais il ne se plaignait pas i est privé dans B. Parce que la vérification de l'accessibilité est effectuée après la recherche de nom,

Le nom i est introuvable, alors l'accessibilité de rien n'a pu être vérifiée.