Probleme spécialisation de template

Probleme spécialisation de template - C++ - Programmation

Marsh Posté le 14-05-2004 à 19:26:12    

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


 

Reply

Marsh Posté le 14-05-2004 à 19:26:12   

Reply

Marsh Posté le 14-05-2004 à 19:32:49    

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

Reply

Marsh Posté le 14-05-2004 à 19:33:48    

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" ))

Reply

Marsh Posté le 14-05-2004 à 19:39:12    

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

Reply

Marsh Posté le 14-05-2004 à 19:41:01    

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

Reply

Marsh Posté le 14-05-2004 à 19:46:14    

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

Reply

Marsh Posté le 14-05-2004 à 19:47:19    

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

Reply

Marsh Posté le 14-05-2004 à 19:51:16    

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 ?

Reply

Marsh Posté le 14-05-2004 à 19:53:50    

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

Reply

Marsh Posté le 14-05-2004 à 19:58:30    

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

Reply

Sujets relatifs:

Leave a Replay

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