C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Spécialization de templates

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Samuel Krempp
Guest





PostPosted: Fri Aug 29, 2003 9:04 am    Post subject: Re: Spécialization de templates Reply with quote



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





PostPosted: Fri Aug 29, 2003 9:13 am    Post subject: Re: Spécialization de templates Reply with quote



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





PostPosted: Sat Aug 30, 2003 8:04 am    Post subject: Re: Spécialization de templates Reply with quote



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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.