Specialisation de template

Specialisation de template - C++ - Programmation

Marsh Posté le 01-05-2006 à 10:21:26    

Bonjour a tous !
 
Je me trouve face a un probleme lors de la specialisation d'un template lorsque celui ci est contenu dans un autre template.
 

Code :
  1. template <class T> struct Container
  2. {
  3. typedef T TypeData;
  4. template <TypeData data> struct elem
  5. {
  6.  static const TypeData ElemData = data;
  7. };
  8. template <class test_elem> struct test
  9. { typedef elem<0> result; };
  10. template <TypeData data> struct test<elem<data> >
  11. { typedef elem<data> result; };
  12. typedef typename test<elem<5> >::result ContResult;
  13. };
  14. struct ContainerUInt
  15. {
  16. typedef unsigned int TypeData;
  17. template <TypeData data> struct elem
  18. {
  19.  static const TypeData ElemData = data;
  20. };
  21. template <class test_elem> struct test
  22. { typedef elem<0> result; };
  23. template <TypeData data> struct test<elem<data> >
  24. { typedef elem<data> result; };
  25. typedef test<elem<5> >::result ContResult;
  26. };
  27. int main(void)
  28. {
  29. cout << Container<unsigned int>::ContResult::ElemData << endl;
  30. cout << ContainerUInt::ContResult::ElemData << endl;
  31. return 0;
  32. }


 
La sortie est :

Code :
  1. 0
  2. 5


 
Dans le template Container<T> la specialization de test<test_elem> est ignoree est la valeure de ContResult est alors 0.
Par contre si je specialise "a la main" ContainerT en ContainerUInt la valeur est bien 5.
 
Quelqu'un aurait-il une explication ?
 
Le resultat est obtenu avec VC++ 8.

Reply

Marsh Posté le 01-05-2006 à 10:21:26   

Reply

Marsh Posté le 01-05-2006 à 10:39:05    

y a pas de spécialisation dans les 2 cas : les paramètres ne sont pas du même type : tantôt entier, tantôt un type.


Message édité par Taz le 01-05-2006 à 10:39:23
Reply

Marsh Posté le 01-05-2006 à 10:43:38    

hum, je dirais même plus. Je ne pense que ce programme soit légal et ça explique la différence de comportement. Dans ta première classe, le paramètre de la spécialisation dépend lui-même d'un paramètre template. Enfin j'ai jamais vu ça du moins.

Reply

Marsh Posté le 01-05-2006 à 10:50:57    

Desole mais je comprends pas tres bien la.
Ce qui m'interesse c'est la specialisation de test<> dans le cas ou le parametre passe est de type elem.
 
Dans le cas 1, le tout est contenu dans le template Container<T>.
Le cas 2 est un cas particulier du cas 1 si T = unsigned int.
 
Le code est le meme dans les 2 cas.
 
je suis d'accord que les 2 types Container<unsigned int>::elem<0> et ContainerUInt::elem<0> sont different mais je passe toujours un type a test<>.

Reply

Marsh Posté le 01-05-2006 à 10:54:28    

le code est différent. les template c'est pas des macros. je maintiens ma théorie.

Reply

Marsh Posté le 01-05-2006 à 23:53:12    

FrozenPaladin a écrit :

Je me trouve face a un probleme lors de la specialisation d'un template lorsque celui ci est contenu dans un autre template. [...] Dans le template Container<T> la specialization de test<test_elem> est ignoree est la valeure de ContResult est alors 0.


 
C'est une violation de 14.7.3.18. Tu ne peux pas spécialiser une classe template si elle est imbriquée dans une classe template non spécialisé explicitement.
 

FrozenPaladin a écrit :

Par contre si je specialise "a la main" ContainerT en ContainerUInt la valeur est bien 5.


La, c'est bon.
 

FrozenPaladin a écrit :

Quelqu'un aurait-il une explication ?


Le code est normallement "ill-formed". AMHA si ça compile, ce n'est pas normal ...

Reply

Marsh Posté le 02-05-2006 à 08:23:16    

OK Merci ++fab

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed