[C++] Très Urgent !!! Question de vie ou de ...

Très Urgent !!! Question de vie ou de ... [C++] - Programmation

Marsh Posté le 25-05-2001 à 22:34:37    

J'ai un très gros problème assez compliqué, je vais essayer d'être le plus clair possible.
 
J'ai un programme développé sur plusieurs fichiers (j'utilise "make" pour l'édition des liens et obtenir l'exécutable). Dans ce programme j'ai 2 fichiers ("tableau.h" comme fichier d'en-tête et "tableau.cc" pour le code des fonctions). Dans "tableau.h" j'ai déclaré une classe générique "tableau" (utilisation de template). Lorsque je compile tout se déroule normalement (j'ai pris des précautions pour la compilation séparée des class template avec gcc.) Lorsque dans mon fichier "main.cc" (celui qui contient le     main() ) je fais une instanciation pour ma class "tableau" avec le type "int" par exemple, tout se compile sans problème. Lorsque dans mon main() je fais appel à une fonction membre de ma class "tableau" dont le code se trouve dans le fichier d'en-tête "tableau.h" car il est suffisamment cours, tout se passe sans problème. Par contre lorsque je fait appel à une fonction membre dont seule l'en-tête a été codée dans "tableau.h" et le corps dans "tableau.cc" (compilation séparée donc), le compilateur me répond qu'il ne peut pas trouver la fonction en question. J'en conclu que mon fichier "tableau.cc" n'est pas correctement construit.
 
J'en fais donc appel à votre "bon coeur", si vous avez une solution ou un site internet qui traiterait de "class template et compilation séparée" je suis preneur.
 
Dernière précision : comme vous l'aurez compris, je suis très pressé aussi, le plus vite sera le mieux.
 
Merci d'avance.

Reply

Marsh Posté le 25-05-2001 à 22:34:37   

Reply

Marsh Posté le 25-05-2001 à 23:33:20    

Tu ne peux pas faire une compilation separée de templates : ton header doit contenir les definitions et donc le source de tes templates. c'est pour une raison tres simple : le compilo doit connaite le type au moment de la compilation.

Reply

Marsh Posté le 26-05-2001 à 14:22:31    

C'est de ça que vous parlez ?  
 

Code :
  1. -fexternal-templates
  2.               Produce  smaller code for template declarations, by
  3.               generating only a  single  copy  of  each  template
  4.               function  where  it is defined.  To use this option
  5.               successfully, you must also mark all files that use
  6.               templates with either `#pragma implementation' (the
  7.               definition) or `#pragma interface'  (declarations).
  8.               When     your     code     is     compiled     with
  9.               `-fexternal-templates', all template instantiations
  10.               are  external.   You must arrange for all necessary
  11.               instantiations  to  appear  in  the  implementation
  12.               file;  you  can  do this with a typedef that refer­
  13.               ences each instantiation needed.  Conversely,  when
  14.               you    compile    using    the    default    option
  15.               `-fno-external-templates', all template  instantia­
  16.               tions are explicitly internal.


 
(man gcc)

Reply

Marsh Posté le 26-05-2001 à 15:24:03    

Ouais. Mais pour pas faire compilqué le mieux c de regrouper ttes les templates (les definitions) dans un header et l'include ds chaque fichier qui les utilise. Le code sera un peu plus gros mais bon qui s'en soucie aujourdhui :)
 

minusplus a écrit a écrit :

C'est de ça que vous parlez ?  
 

Code :
  1. -fexternal-templates
  2.               Produce  smaller code for template declarations, by
  3.               generating only a  single  copy  of  each  template
  4.               function  where  it is defined.  To use this option
  5.               successfully, you must also mark all files that use
  6.               templates with either `#pragma implementation' (the
  7.               definition) or `#pragma interface'  (declarations).
  8.               When     your     code     is     compiled     with
  9.               `-fexternal-templates', all template instantiations
  10.               are  external.   You must arrange for all necessary
  11.               instantiations  to  appear  in  the  implementation
  12.               file;  you  can  do this with a typedef that refer­
  13.               ences each instantiation needed.  Conversely,  when
  14.               you    compile    using    the    default    option
  15.               `-fno-external-templates', all template  instantia­
  16.               tions are explicitly internal.


 
(man gcc)



Reply

Marsh Posté le 26-05-2001 à 15:43:58    

je comprends pas où est son problème ?
 
Les templates sont déclarés dans tableau.h qui est inclus dans tableau.cc et main.cc, non ? Et ben si il compile sans 'external-templates', ça devrait marcher ?

Reply

Marsh Posté le 26-05-2001 à 15:49:06    

Ben non ila compile les templates dans un fichier a part et il na garde ds le header que les decl, ensuite il veut linker les deux alors que le compilo (avant le linker) a besoin de connaitre le type des templates.
 
PS : c aussi un pb des templ c que tu peu pas par ex fournir une lib de templ avec un header qui contient juste les decl, enfin pas de maniere triviale
 

minusplus a écrit a écrit :

je comprends pas où est son problème ?
 
Les templates sont déclarés dans tableau.h qui est inclus dans tableau.cc et main.cc, non ? Et ben si il compile sans 'external-templates', ça devrait marcher ?



 

[edit]--Message édité par Amadeus--[/edit]

Reply

Marsh Posté le 26-05-2001 à 15:52:17    

Pour preciser encore plus, s'il veut faire simple, il doit copier le contenu de son tableau.cc ds tableau.h et virer tableau.cc du projet.

 

[edit]--Message édité par Amadeus--[/edit]

Reply

Marsh Posté le 26-05-2001 à 16:00:21    

Amadeus a écrit a écrit :

Pour preciser encore plus, s'il veut faire simple, il doit copier le contenu de son tableau.cc ds tableau.h et virer tableau.cc du projet.




 
Personnellement, je ferais un  
#ifdef GGG
   #include "tableau.cc"  
#endif
 
à la fin de tableau.h. C'est le même esprit que ta proposition.
 
J'ai déjà fait ce genre de manip sur un gros projet. C'est une limitation de gcc qui gère les template de manière bizarre.

 

[edit]--Message édité par kadreg--[/edit]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-05-2001 à 16:03:54    

ah ok, il a pas tout fait d'un bloc !
 

Citation :


Pour preciser encore plus, s'il veut faire simple, il doit copier le contenu de son tableau.cc ds tableau.h et virer tableau.cc du projet.


 
Y'a une (a merde, on peut pas dire bibliothèque...) disons un toolkit d'algèbre linéraire qui est fait comme ça : c'est un ensemble de header à inclure sans binaires. Je trouve ça trés bien : c'est simple à utiliser et trés intuitif du fait des templates...

Reply

Marsh Posté le 26-05-2001 à 16:27:25    

C vrai c elegant les templates et en plus c de l'open source de fait :)

Reply

Sujets relatifs:

Leave a Replay

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