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?