[ANSI C++] Templates

Templates [ANSI C++] - C++ - Programmation

Marsh Posté le 11-12-2003 à 23:20:24    

Essayons d'utiliser du standard tout au long de ce topic.  
g++ sera le compilateur de reference.
 
Je suis habitue a l'Ansi C mais je vois les avantages de l'OO en particulier la force des templates.
 
Malheureusment, j'ai toujours un peu de mal avec.  
 
Mon pb actuel, c'est comment declarer des objets specifies de templates.
 
J'ai une class template nommee  

Code :
  1. template<class T>
  2. class Foo {
  3. ...
  4. }


 
Ailleurs, je peux declarer

Code :
  1. Foo<Bar> foo;

tant en argument de fonction que dans le main.  
 
Cependant, quand je le mets dans la partie privee d'une autre classe, le compilateur m'insulte avec

FooBar.h:101: error: 'Foo' is used as a type, but is not defined as a type.


 
Quel est le bleme ??


Message édité par iraysyvalo le 12-12-2003 à 02:23:49
Reply

Marsh Posté le 11-12-2003 à 23:20:24   

Reply

Marsh Posté le 11-12-2003 à 23:32:27    

donne du vrai code. et oublie pas les ;  
 
Foo est token invalide
Foo<Bar> est valide

Reply

Marsh Posté le 12-12-2003 à 02:43:47    

Les ; corriges sur le post initial ..  
 
Finalement, ca marche bien .. le pb etait une erreur de syntaxe sur le nom (tres long a l'origine) de mon template.  
 
Voici ce que j'ai essaye de faire pour ref:

Code :
  1. #ifndef FOO_H
  2. #define FOO_H
  3. template<class T>
  4. class Foo {
  5. public:
  6.   explicit Foo(int foo=1) : foo_(foo){ };
  7.   virtual ~Foo(){ }; // In case u need to inherit from this one.
  8.   void useT();
  9. private:
  10.   int foo_;
  11. };
  12. //////////////////////////////////////////////////////////////////
  13. // Foo class definition (separate compilation model)
  14. #include <iostream>
  15. template<class T>
  16. void
  17. Foo<T>::useT(){ 
  18.   std::cout << "This template instance tag  " << foo_ << std::endl;
  19.   std::cout << "Size of the class parameter " << sizeof (T) << " bytes." << std::endl;
  20. }
  21. #endif//FOO_H


 

Code :
  1. #ifndef BAR_H
  2. #define BAR_H
  3. #include "Foo.h" // We need Foo template.
  4. struct BarBar {
  5.   int barMan;
  6. };
  7. class Bar {
  8. public
  9.   Bar() { };
  10.   ~Bar() { };
  11.   void verbose();
  12. private:
  13.   Foo<BarBar> bar_;
  14. };
  15. #endif//BAR_H


 

Code :
  1. #include "Bar.h"
  2. #include <iostream>
  3. void
  4. Bar::verbose(){
  5.   std::cout << "Seems to work .." << std::endl;
  6.   bar_.useT();
  7. }


Message édité par iraysyvalo le 12-12-2003 à 02:57:05
Reply

Marsh Posté le 12-12-2003 à 12:39:23    

  • pitié, pas les trailing _ [:totoz]
  • "Seems to work .." << std::endl -> "Seems to work ..\n"


  • #ifndef BAR_H

#define BAR_H
 
penses au nombre de mec qui ont écrit BAR_H
il te faut un truc assez unique, donc une grosse combinaison > 10caractères nom/projet/date/fichier

Reply

Marsh Posté le 12-12-2003 à 18:51:21    


Heu .. c'etait un exemple rapide pour illustrer le propos :)
 
Sinon tu utilises rien pour distinguer tes membres prives ?

Reply

Marsh Posté le 12-12-2003 à 18:55:50    

si mais pas une notation source d'erreur. un my, m, ou autre est peut être préférable et c'est beaucoup plus esthétique.
va voir les tutoriels, et conclue en qu'il vaut mieux utiliser "typename" que "class"

Reply

Marsh Posté le 12-12-2003 à 18:59:27    

Taz a écrit :

si mais pas une notation source d'erreur. un my, m, ou autre est peut être préférable et c'est beaucoup plus esthétique.
va voir les tutoriels, et conclue en qu'il vaut mieux utiliser "typename" que "class"

J'avais lu un truc comme ça effectivement, maintenant je le fais par réflexe, mais quelle en est la raison ?
"class" ça englobe aussi ce qui n'en est pas (types primitif, structs) il me semble non ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 12-12-2003 à 19:03:34    

non.
typename a plus le nom de l'emploi, et malgré l'équivalence pour les  situations de bases, class a un rôle et une signification particulière dans le cas de paramètre template template

Reply

Marsh Posté le 12-12-2003 à 22:08:56    


Bon .. c'est la deuxieme fois que je vois tutos .. mais lesquels ??  
 
Taz, me manges pas, j'aime bien les Taz ;)

Reply

Marsh Posté le 13-12-2003 à 00:08:30    

y a des posts fixes , y a les liens ki faut dedans

Reply

Sujets relatifs:

Leave a Replay

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