 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Sebastien Tanguy Guest
|
Posted: Thu Sep 15, 2005 7:45 pm Post subject: heritage et template |
|
|
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.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Sep 15, 2005 9:18 pm Post subject: Re: heritage et template |
|
|
On Thu, 15 Sep 2005 21:45:52 +0200, Sebastien Tanguy
<seb+news200509 (AT) death-gate (DOT) fr.eu.org>:
| Quote: | 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).
| Quote: | 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.
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Sep 15, 2005 9:19 pm Post subject: Re: heritage et template |
|
|
Sebastien Tanguy a écrit :
| Quote: | Bonjour,
Soit le code suivant:
template <class U
class Foo
{
public:
void doStuff(){}
};
template
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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Sep 16, 2005 3:31 am Post subject: Re: heritage et template |
|
|
On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
<gramster (AT) gramster (DOT) com>:
| Quote: | 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 :-)
|
|
| Back to top |
|
 |
JBB Guest
|
Posted: Fri Sep 16, 2005 11:35 am Post subject: Re: heritage et template |
|
|
Fabien LE LEZ a écrit :
| Quote: | On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
[email]gramster (AT) gramster (DOT) com[/email]>:
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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Sep 16, 2005 5:08 pm Post subject: Re: heritage et template |
|
|
On Fri, 16 Sep 2005 13:35:31 +0200, JBB <merci (AT) pasdespam (DOT) fr>:
| Quote: | 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.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|