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->" ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
On Thu, 15 Sep 2005 21:45:52 +0200, Sebastien Tanguy
<seb+news200509@death-gate.fr.eu.org>:
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.
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.
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
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).
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
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 :-)
On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
<gramster@gramster.com>:
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 :-)
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 :-)
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
On Thu, 15 Sep 2005 23:18:09 +0200, Fabien LE LEZ
<gramster@gramster.com>:
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) ?
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
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.
On Fri, 16 Sep 2005 13:35:31 +0200, JBB <merci@pasdespam.fr>:
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.