 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Samuel Krempp Guest
|
Posted: Fri Aug 29, 2003 9:04 am Post subject: Re: Spécialization de templates |
|
|
le Vendredi 29 Août 2003 09:24, [email]nospam (AT) nospam (DOT) fr[/email] écrivit :
| Quote: | Bonjour à tous,
j'ai la classe suivante :
template<class T> class A
{
public:
void methA();
void methB();
};
et je veux spécialiser une méthode de cette classe :
template<int> class A
{
public:
void methA();
};
Le problème, c'est que le code suivante ne compile pas sous VC6:
A<int> a;
a.methB();
sous prétexte que la méthode 'methB' n'est pas trouvé dans la classe
|
il faut bien voir que la spécialisation de template est complètement
orthogonale à l'héritage de classe.
spécialiser un template A<T> pour T=int ne prend aucunement en compte ce que
tu as mis dans le template général.
| Quote: | A<int>. D'où ma question : faut-il réécrire TOUTES les méthodes d'une
classe lorsque l'on spécialise un paramètre template (ce qui me semble
quand même un peu lourd), ou bien alors est-ce un bug de mon ami VC6?
|
1. ce n'est pas un bug.
2. tu n'es pas tjrs obligé de réécrire tout.
Par exple en faisant dériver A<T> et A<int> d'un template de classe
A_base<T> (non spécialisé pour int), dans lequel tu mets les méthodes
communes à A<T> et A<int>.
Sinon, pour avoir du polymorphisme sur les diverses classe A<truc>, tu peux
faire une classe A_base (indépendante du type T) qui contient des méthodes.
L'avantage est que tu peux manipuler divers A<truc> par des A_base*, mais le
fait que A_base ne connaisse pas le type limite le champ de ce que tu peux
faire d'utile avec ses méthodes.
Tu peux même faire les 2 à la fois,
A_base
template<class T> class A_commun : public A_base { .. };
template<class T> class A : public A_commun { .. };
bref, tu vois comment combiner templates et héritage, ya plein de choses
possibles.
Ceci dit, avec une petite classe de 2-3 petites méthodes, éviter le
recopiage ne vaut peut être pas la complication d'utilier des héritages..
--
Sam
Enlever les mots en trop dans mon e-mail pour répondre
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Fri Aug 29, 2003 9:13 am Post subject: Re: Spécialization de templates |
|
|
le Vendredi 29 Août 2003 11:04, [email]krempp (AT) crans (DOT) trucs.en.trop.org[/email] écrivit :
| Quote: | mais le fait que A_base ne connaisse pas le type limite le champ
de ce que tu peux faire d'utile avec ses méthodes.
|
j'aurais dû préciser, "avec *les signatures* de ses méthodes". les méthodes
elles-même (virtuelles pures par exemple..) n'ont pas à faire quoi que ce
soit, normalement c'est leur signature qui est utile. Et elles sont
limitées à utiliser des types fixes, pas T, et c'est ça la limite dont je
parlais précisément.
--
Sam
Enlever les mots en trop dans mon e-mail pour répondre
|
|
| Back to top |
|
 |
SteveR Guest
|
Posted: Sat Aug 30, 2003 8:04 am Post subject: Re: Spécialization de templates |
|
|
Guillaume Gourdin <nospam (AT) nospam (DOT) fr> writes:
| Quote: | Bonjour à tous,
j'ai la classe suivante :
template<class T> class A
{
public:
void methA();
void methB();
};
et je veux spécialiser une méthode de cette classe :
template<int> class A
{
public:
void methA();
};
|
Si vous voulez spécialiser seulement une méthode de la class A<int>,
vous devez spécialiser la *méthode*:
template <> void A<int>::methA()
{
// ...
}
| Quote: | Le problème, c'est que le code suivante ne compile pas sous VC6:
A<int> a;
a.methB();
sous prétexte que la méthode 'methB' n'est pas trouvé dans la classe A<int>.
D'où ma question : faut-il réécrire TOUTES les méthodes d'une classe lorsque
l'on spécialise un paramètre template (ce qui me semble quand même un peu
lourd), ou bien alors est-ce un bug de mon ami VC6?
|
--
SteveR
|
|
| 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
|
|