"Pascal J. Bourguignon" <
p...@informatimago.com> writes:
>> Un nom comme _points ne dépend pas visiblement d'un paramètre template et
>> on ne va pas chercher les membres des classes de base qui sont des
>> instantiations avec des paramètres du template. this->_points rend le nom
>> dépendant et il est donc cherché à la définition.
>
> C'est clair!
Oops, a l'instantiation et pas a la definition, et donc en utilisant
donc les parametres du template qui sont connus.
Un complement sur la cause.
D'une part, le mecanisme des specialisations explicites fait qu'on ne
peut reellement rien faire pour les noms dependant avant l'instantiation
(On ne sait pas que foo<T> a un membre _toto sans connaitre T parce
qu'il peut y avoir des specialisations explicites de foo qui n'en ont
pas).
On cherche les noms non dependant dans le contexte de definition plutot
que d'instantiation (ce qui serait possible et etait fait en pratique
avant qu'on ne definisse clairement le mecanisme de recherche; certains
compilateurs -- dont il me semble VC++ -- ont mis longtemps a etre
conforme sur ce point) parce que la recherche dans le contexte
d'instantiation trouve facilement des definitions inattendus. Avec
cette regle,
int foo;
template <typename T> struct S: T
{
void incfoo() { foo++; }
}
incremente systemantiquement la variable globale, et non la variable
globale quand T n'a pas de membre foo et le membre quand T en a un. On
le paie par une erreur et la necessite d'utiliser this->foo si on veut
le membre et qu'il n'y a pas de variable globale.
A+
--
Jean-Marc
FAQ de fclc++:
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ