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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme spécialisation de template

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme spécialisation de template

n°726561
Profil sup​primé
Posté le 14-05-2004 à 19:26:12  answer
 

j'ai un probleme de spécialisation de template
le code suivant devrait produire la sortie suivante :  
 
generique
34532
specialisé
hello world
 
et moi il me sort generique qu lieu de specialisé
autrement dit il ne comprend pas que j'ai spécialisé le template pour string.
est ce que ce code est correct ou pas ?  
j'ai fait mon test avec le Sun CC 5.3
 
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <strstream>
  4. using namespace std;
  5. template<typename T> T fromString(const string & s)
  6. {
  7.    cout << "generique" << endl;
  8.    istrstream stream(s.c_str());
  9.    T tmp;
  10.    stream >> tmp;
  11.    return tmp;
  12. }
  13. template<> string fromString<string>(const string & s)
  14. {
  15.   cout << "specialisé" << endl;
  16.   return s;
  17. }
  18. int main()
  19. {
  20.       string i_str = "34532";
  21.       int i = fromString<int>(i_str);
  22.       cout << i << endl;
  23.       string s = "hello world";
  24.       string s_str = fromString<string>(s);
  25.       cout << s << endl;
  26.      system("PAUSE" );
  27. }


 

mood
Publicité
Posté le 14-05-2004 à 19:26:12  profilanswer
 

n°726563
pab29
Posté le 14-05-2004 à 19:32:49  profilanswer
 

Oualb a écrit :

j'ai un probleme de spécialisation de template
le code suivant devrait produire la sortie suivante :  
 
generique
34532
specialisé
hello world
 
et moi il me sort generique qu lieu de specialisé
autrement dit il ne comprend pas que j'ai spécialisé le template pour string.
est ce que ce code est correct ou pas ?  
j'ai fait mon test avec le Sun CC 5.3
 
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <strstream>
  4. using namespace std;
  5. template<typename T> T fromString(const string & s)
  6. {
  7.    cout << "generique" << endl;
  8.    istrstream stream(s.c_str());
  9.    T tmp;
  10.    stream >> tmp;
  11.    return tmp;
  12. }
  13. template<> string fromString<string>(const string & s)
  14. {
  15.   cout << "specialisé" << endl;
  16.   return s;
  17. }
  18. int main()
  19. {
  20.       string i_str = "34532";
  21.       int i = fromString<int>(i_str);
  22.       cout << i << endl;
  23.       string s = "hello world";
  24.       string s_str = fromString<string>(s);
  25.       cout << s << endl;
  26.      system("PAUSE" );
  27. }




 
 
juste pour dire que je suis d'accord avec ton résultat théorique et VS .NET 2002 aussi

n°726564
Taz
bisounours-codeur
Posté le 14-05-2004 à 19:33:48  profilanswer
 

chez moi ça marche
 
 
renplace tes strstream par des stringstream (<sstream> )
utilise les constructeurs, plutot que l'initialisation par copie (string s = "plop" -> string s("plop" ))

n°726567
pab29
Posté le 14-05-2004 à 19:39:12  profilanswer
 

Taz a écrit :

chez moi ça marche
 
 
renplace tes strstream par des stringstream (<sstream> )
utilise les constructeurs, plutot que l'initialisation par copie (string s = "plop" -> string s("plop" ))


 
c'est pas pour pinailler (enfin si un peu quand même...), mais string s = "plop" est strictement équivalent à string s("plop" ) non ?
 
c'est pas comme si on faisait string s;s= = "plop"; ...

n°726576
Profil sup​primé
Posté le 14-05-2004 à 19:41:01  answer
 

je viens d'essayer avec un vieux gcc et ca marche !!
 
 
avec CC il accepte la specialisation seulement quand il trouve lui même le type du template, c'est à dire si je mettais fromString(s) au lieu de fromString<string>(s)
mais le probleme c'est que je peux pas faire ca vu que le type template n'apparait que dans le retour de la fonction
ou alors je mets     void fromString<T>(const string & source, T & cible)   mais ca me plait moins
 
avec stringstream c'est pareil

n°726579
Taz
bisounours-codeur
Posté le 14-05-2004 à 19:46:14  profilanswer
 

non parce que comme je l'ai dit, = est une initialization par copie. ton compilateur est libre d'implémenter une optimisation, mais ce n'est nullement requis (certain le fond pas d'ailleurs)
 
alors autant ne pas l'oublier et utiliser la syntaxe du constructeur
 
g++ fait cette optimisation, et également si tu écris
Foo f = Foo(3);
 
la seul instruction généré sera Foo(int) et rien d'autres, optimisation oblige

n°726581
Taz
bisounours-codeur
Posté le 14-05-2004 à 19:47:19  profilanswer
 

bah moi je préfère, puisque la déduction de type est possible
 
tu n'a plus qu'à écrire
 
fromString("3", i);
fromString("plop", str);
 
:D

n°726582
Profil sup​primé
Posté le 14-05-2004 à 19:51:16  answer
 

ok tu trouves que c'est mieux comme ca ?
bon je vais faire ca alors
 
mais sinon c'est quand meme bien un bug du compilo cette histoire ?

n°726586
Taz
bisounours-codeur
Posté le 14-05-2004 à 19:53:50  profilanswer
 

pas un bug, juste un truc pas implémenter
 
c'est pas que je trouve ça mieux, c'est que c'est un sucre syntaxique : pas la peine de spécifier le type paramètre, le compilateur pourra dans l'immense majorité des cas le deviner, alors qu'avec ton autre solution ou seul le retour varie, il faut expliciter tout ça ... ce qui peut devenir lourd et source d'erreur

n°726593
Profil sup​primé
Posté le 14-05-2004 à 19:58:30  answer
 

ouais ok un truc pas implémenté ...
mais ca fait chier !
 
en fait ce qui me fait peur c que cette appli devra etre porté vers Linux, Windows et HPUX
j'espere que les compilos n'auront pas oublié d'implémenter certaines features sinon je suis mal !
y'a toute une hiérarchie de classes templates avec des heritages en diamant, certains virtuels d'autre non, je crois les doigts !!!


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

  Probleme spécialisation de template

 

Sujets relatifs
[ASP] Probleme de formule avec Regular ExpressionPetit Probleme de programmation
[php] Probleme d'espace (le caractere) [Résolu]fonctions template
[ASP.NET] Problème pour accéder à une variable SessionSoucis avec un template...
[java] probleme de newbie (tri de tableau)probleme de confirmation
[XHTML / CSS] problème d'alignement horizontal [Résolu][PHP-Sogenactif] Probleme de passage de variables de sessions [resolu]
Plus de sujets relatifs à : Probleme spécialisation de template


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