fonction template dans une classe template

fonction template dans une classe template - C++ - Programmation

Marsh Posté le 14-09-2004 à 21:18:04    

je me demandais quelle etait la syntaxe pour definir une fonction template au sein d'une classe template
 
sur un exemple simple :
 

Code :
  1. template <typename T> class foo {
  2.   void bar(int i);
  3. }
  4. template <typename T>
  5. void foo<T>::bar(int i){
  6.   // fonction a rendre template (pour rendre le parametre generique)
  7. }


 
je ne vois pas trop :heink:

Reply

Marsh Posté le 14-09-2004 à 21:18:04   

Reply

Marsh Posté le 14-09-2004 à 21:22:28    

c'etait Presque Ca :
 

Code :
  1. template <typename T> class foo
  2. {
  3.   void bar(T i) { // corps de la functino ici };
  4. }


Message édité par Joel F le 14-09-2004 à 21:23:10
Reply

Marsh Posté le 14-09-2004 à 21:32:14    

pourquoi "corps de la fonction ici"
 
je crois que ce que tu veux c'est ça
 

Code :
  1. #include <iostream>
  2. template<typename T>
  3. struct Foo
  4. {
  5.   void foo(T);
  6.   template<typename NOT_T>
  7.   void foo(NOT_T);
  8. };
  9. template<typename T>
  10. void Foo<T>::foo(T)
  11. {
  12.   std::cout << "Foo<T>\n";
  13. }
  14. template<typename T>
  15. template<typename NOT_T>
  16. void Foo<T>::foo(NOT_T)
  17. {
  18.   std::cout << "Foo<NOT_T>\n";
  19. }
  20. int main()
  21. {
  22.   Foo<int> f;
  23.   f.foo(3);
  24.   f.foo(3.14);
  25. }


 
 
 

Reply

Marsh Posté le 14-09-2004 à 21:55:24    

arf j'avais po compris la question :p

Reply

Marsh Posté le 14-09-2004 à 22:23:15    

Yep, merci Taz :jap:

Reply

Marsh Posté le 15-09-2004 à 11:45:18    

maintenant, extension de la question ^^
 
la specialisation d'un operateur template ...
 
j'ai tente de faire comme suit, mais apparamment ... ce n'es pas vraiment ca :D
 

Code :
  1. #include <iostream>
  2. template<typename T>
  3. struct Foo
  4. {
  5.   void foo(T);
  6.   template<typename NOT_T>
  7.   Foo<T>& operator+=(NOT_T);
  8. };
  9. template<typename T>
  10. void Foo<T>::foo(T)
  11. {
  12.   std::cout << "Foo<T>\n";
  13. }
  14. template<typename T>
  15. template<typename NOT_T>
  16. Foo<T>& Foo<T>::operator +=(NOT_T)
  17. {
  18.   std::cout << "+=<NOT_T>\n";
  19. }
  20. template<typename T>
  21. template<>
  22. Foo<T>& Foo<T>::operator += <int> ()
  23. {
  24.   std::cout << "+=<int>\n";
  25. }
  26. int main()
  27. {
  28.   Foo<int> f;
  29.   f.+=3;
  30.   f.+=3.14;
  31. }

Reply

Marsh Posté le 15-09-2004 à 11:48:10    

pour que veux pas avoir un operator+=(int) tout simplement ?
quel besoin tu as de le spécialiser ?

Reply

Marsh Posté le 15-09-2004 à 11:54:33    

ce que je voulais dire c'est que de toutes façons, la spécialisation partielle, c'est que pour les classes

Reply

Marsh Posté le 15-09-2004 à 16:37:01    

ok, tant pis :/ je peux faire autrementm c'est sur, mais ca me semblait plus coherent de le faire avec un operateur specialise :D
 
Merci quand meme
 
(Edit : pour la raison en fait, il s'agissait d'un operateur sur une classe matrice [projet scolaire inside] et je voulais simplement faire un operateur template pour la multiplication [traiter les cas ou on multiplie par une matrice differemment de ceux ou on multiplie par une valeur quelconque])


Message édité par theshockwave le 15-09-2004 à 16:42:00
Reply

Marsh Posté le 15-09-2004 à 17:10:46    

pourquoi template ?

Reply

Marsh Posté le 15-09-2004 à 17:10:46   

Reply

Marsh Posté le 15-09-2004 à 23:34:11    

theShOcKwAvE a écrit :

pour la raison en fait, il s'agissait d'un operateur sur une classe matrice [projet scolaire inside] et je voulais simplement faire un operateur template pour la multiplication [traiter les cas ou on multiplie par une matrice differemment de ceux ou on multiplie par une valeur quelconque


 
une surcharge simple suffit
 
operator*(const Matrice& m1, const Matrice& m2)
 
operator*(const Matrice& m1, double d)

Reply

Marsh Posté le 15-09-2004 à 23:51:01    

faut commencer par *= bordel :o

Reply

Marsh Posté le 16-09-2004 à 11:03:19    

peut-on rendre la surcharge template elle-meme ? Je ne crois pas ...
Je ne vais pas prevoir tous les types par lesquels on pourrait faire une multiplication ... surtout si on supose que l'utilisateur pourra avoir redefini ses propres classes a gerer dans des matrices ...
 
en fait, j'aurais simplement voulu geerer independamment les cas suivants :
 

Code :
  1. Matrice<T1>::operator *=(const Matrice<T2> & );
  2. Matrice<T1>::operator *=(const T2 & );


Reply

Marsh Posté le 16-09-2004 à 15:26:36    

Sauf que Matrice<T2> c'est aussi un type est donc le compilo va utiliser le *=(const T2& ) [:le kneu]

Reply

Marsh Posté le 16-09-2004 à 20:53:41    

Joel F a écrit :

Sauf que Matrice<T2> c'est aussi un type est donc le compilo va utiliser le *=(const T2& ) [:le kneu]


 
C'est bien là le problème :o
 
mais je m'en approchais doucement avec des questions simples au début :D


Message édité par theshockwave le 16-09-2004 à 20:54:13
Reply

Marsh Posté le 16-09-2004 à 22:50:18    

ecoute, je bosse sur une librairie matricielle depuis 1 an et demi et je peut te dire que tu n'as pas d'autre solutino que specialiser pr chaque type POD ...

Reply

Marsh Posté le 17-09-2004 à 11:06:41    

okok, je laisse tomber, alors :D

Reply

Marsh Posté le 17-09-2004 à 11:16:10    

nah, si tu trouves une soluce tiens moi au courant :p

Reply

Sujets relatifs:

Leave a Replay

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