mot clef: typename

mot clef: typename - C++ - Programmation

Marsh Posté le 29-07-2003 à 00:41:07    

voici le mot clef typename, que trop peu connaissent.
 
typename A
 
permet de spécifier au compilateur que A est un type (ce qui n'est pas toujours évident)
 
2 utilisations:
 
* en remplacement dans les paramètre de types dans les déclaration des templates

Code :
  1. template <class T> Foo;


peut s'ecrire avec préférence

Code :
  1. template <typename T> Foo;


retenez-le, histoire de ne pas être surpris  ;)  
 
* pour permettre au compilateur certaines résolutions de type. ceci concerne les templates: vous avez une classe template<typename T> et dans cette classe, vous souhaitez manipuler un sous-type (pas au sens de l'héritage, je retrouve pas le mot) de T, T::sous_type. Très bien, mais ça ne passera pas à la compilation, votre compilateur va perdre les pedales: il ne connait même pas T !!!
alors à vous de lui spécifer que T::sous_type est bien un type.
 
 
pour des raisons historiques, class est trop souvent utilisé, et pose souvent problème aux débutants puisque class à déjà un autre emploi (est ce que ça va marcher avec mes struct, mes int ??)
 
typename porte bien son nom, utilisez le.
 
petit exemples à tester
 

Code :
  1. template<typename T>
  2. class Foo
  3. {
  4. public:
  5.   typedef T data_type;
  6.  
  7.   typedef typename data_type::data_type nestded_data_type;
  8.   void go() const
  9.   {
  10.     nestded_data_type i;
  11.     // si vous n'avez pas fait de typedef
  12.     typename T::data_type j;
  13.     i = j;
  14.   }
  15. };
  16. class Bar
  17. {
  18. public:
  19.   typedef int data_type;
  20. };
  21. class Baz
  22. {
  23. public:
  24.   typedef float data_type;
  25. };
  26. #include <iostream>
  27. #include <typeinfo>
  28. using namespace std;
  29. int main()
  30. {
  31.   Foo<Bar>::nestded_data_type a;
  32.   Foo<Baz>::nestded_data_type b;
  33.   cout << typeid(a).name() << endl
  34.        << typeid(b).name() << endl;
  35.   Foo<Bar> r;
  36.   Foo<Baz> z;
  37.   r.go();
  38.   z.go();
  39. }


 
 
autre exemple  
 

Code :
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. struct Rose {};
  5. struct A { typedef Rose rose; };
  6. template<typename T>
  7. struct B : T { typedef typename T::rose foo; };
  8. template<typename T>
  9. void smell( T ) { cout << "awful" << endl; }
  10. void smell( Rose ) { cout << "sweet" << endl; }
  11. int main() {
  12. smell( A::rose() );
  13. smell( B<A>::foo() );
  14. }


Message édité par Taz le 19-04-2004 à 23:14:47
Reply

Marsh Posté le 29-07-2003 à 00:41:07   

Reply

Marsh Posté le 29-07-2003 à 00:50:32    

bien ceci


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 05-10-2003 à 13:44:33    

petites corrections, nouvel exemple. les explications sont toujours aussi approximatives, mais je crois que c'est la seule façon de parler aux débutants

Reply

Marsh Posté le 07-10-2003 à 04:40:38    

C est le problem que javais dans ma template, car j utilisai dans cette template une structure  lie au <T>
warning mais sa compile quand meme.
 


---------------
jeunes con de la derniere averse, vieux con des neiges d'antant.
Reply

Marsh Posté le 07-10-2003 à 07:38:52    

et ?

Reply

Marsh Posté le 07-10-2003 à 08:06:00    


et que javasi pas compris     [:dams86]


---------------
jeunes con de la derniere averse, vieux con des neiges d'antant.
Reply

Marsh Posté le 07-10-2003 à 08:07:24    

corrigé donc

Reply

Sujets relatifs:

Leave a Replay

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