Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1793 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Specialisation de template

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Specialisation de template

n°1356976
FrozenPala​din
Posté le 01-05-2006 à 10:21:26  profilanswer
 

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.

mood
Publicité
Posté le 01-05-2006 à 10:21:26  profilanswer
 

n°1356980
Taz
bisounours-codeur
Posté le 01-05-2006 à 10:39:05  profilanswer
 

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
n°1356982
Taz
bisounours-codeur
Posté le 01-05-2006 à 10:43:38  profilanswer
 

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.

n°1356985
FrozenPala​din
Posté le 01-05-2006 à 10:50:57  profilanswer
 

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<>.

n°1356987
Taz
bisounours-codeur
Posté le 01-05-2006 à 10:54:28  profilanswer
 

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

n°1357468
++fab
victime du syndrome IH
Posté le 01-05-2006 à 23:53:12  profilanswer
 

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 ...

n°1357540
FrozenPala​din
Posté le 02-05-2006 à 08:23:16  profilanswer
 

OK Merci ++fab


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Specialisation de template

 

Sujets relatifs
Vecteur sans template[C++] Template... erreur tte bete surement...
erreur de spécialisation d'un template ...[resolu] [perl] problème "lib text::template" suite migration server
Utilisation templateProblème avec un template: balise boddy déséquilibrée
Specialisation de template et erreur de link... [presque resolu]spécialisation de fonctions membres (template) d'une classe template
Probleme spécialisation de templateSpécialisation template & Pétage de plomb
Plus de sujets relatifs à : Specialisation de template


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR