OVH Cloud OVH Cloud

heritage et template

5 réponses
Avatar
Sebastien Tanguy
Bonjour,

Soit le code suivant:

template <class U>
class Foo
{
public:
void doStuff(){}
};

template <class X>
class Quux : public Foo< X >
{
public:
void baaz(){
doStuff();
}
};


Celui-ci compile avec g++ 3.x, mais non avec g++ 4 ou Comeau, qui
n'arrivent pas à résoudre le nom de la méthode de la classe mère.

Je suppose que c'est dû au template, qui, sans instanciation, ne
connait le type exact de la classe mère. Et donc, j'aurais tendance à
croire que le nouveau g++ et Comeau sont dans le vrai (même si...).

Cependant, quelle serait la meilleure (ou plus propre) méthode pour
résoudre le problème? Utiliser un "using" pour introduire la méthode?
Préfixer explicitement par le nom de la classe mère paramètrée?
Utiliser systèmatiquement la notation "this->" ?


Merci d'avance.
seb.

5 réponses

Avatar
Fabien LE LEZ
On Thu, 15 Sep 2005 21:45:52 +0200, Sebastien Tanguy
<seb+:

Celui-ci compile avec g++ 3.x


Tiens, c'est marrant, j'aurais cru que 3.x râlerait (au moins la 3.4.2
qui est sur mon PC).

Utiliser systèmatiquement la notation "this->" ?


A priori, c'est celle que je préfère, car on n'a pas besoin de faire
référence à quoi que ce soit d'autre -- on met un "this->" devant
chaque membre hérité et basta.

Avatar
Loïc Joly
Bonjour,

Soit le code suivant:

template <class U>
class Foo
{
public:
void doStuff(){}
};

template <class X>
class Quux : public Foo< X >
{
public:
void baaz(){
doStuff();
}
};


Disclaimer : Je suis pas certain de pas dire de conneries, et ai la
flemme de vérifier... ;)

Tel qu'écrit ici, doStuff n'a pas l'air au premier coup d'oeil de
dépendre de l'argument template T. Donc, le compilateur cherche cette
fonction avant d'instancier le template, et donc de voir qu'elle est
définie dans la classe de base (une spécialisation de Foo pourrait faire
qu'elle n'y est pas, par exemple).

Donc, il suffit de faire dépendre ce nom de T pour que ça marche. En
général, les gens utilisent this->doStuff() pour ça (en effet, this
dépend de T).

--
Loïc

Avatar
Fabien LE LEZ
On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
:

Utiliser systèmatiquement la notation "this->" ?


A priori, c'est celle que je préfère


...du moins, si tu dois l'utiliser rarement.
Je suis en train de réparer un vieux code qui utilise fréquemment des
membres d'une classe de base, et je confirme que "using" est bien plus
pratique, car on n'a besoin de le spécifier qu'une seule fois :-)


Avatar
JBB
On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
:


Utiliser systèmatiquement la notation "this->" ?


A priori, c'est celle que je préfère



...du moins, si tu dois l'utiliser rarement.
Je suis en train de réparer un vieux code qui utilise fréquemment des
membres d'une classe de base, et je confirme que "using" est bien plus
pratique, car on n'a besoin de le spécifier qu'une seule fois :-)

Pardonnez mon ignorance mais c'est quoi "using" (dans le cas du this) ?

Ca ne sert pas que pour les namespace?

JBB



Avatar
Fabien LE LEZ
On Fri, 16 Sep 2005 13:35:31 +0200, JBB :

Pardonnez mon ignorance mais c'est quoi "using" (dans le cas du this) ?


Ça permet à un membre d'une classe de base de devenir membre à part
entière de la classe dérivée, et pas seulement membre par héritage.