Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2810 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°34465
esseki
Posté le 25-05-2001 à 22:34:37  profilanswer
 

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.

mood
Publicité
Posté le 25-05-2001 à 22:34:37  profilanswer
 

n°34469
Amadeus
Posté le 25-05-2001 à 23:33:20  profilanswer
 

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.

n°34503
minusplus
Posté le 26-05-2001 à 14:22:31  profilanswer
 

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)

n°34507
Amadeus
Posté le 26-05-2001 à 15:24:03  profilanswer
 

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)



n°34511
minusplus
Posté le 26-05-2001 à 15:43:58  profilanswer
 

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 ?

n°34513
Amadeus
Posté le 26-05-2001 à 15:49:06  profilanswer
 

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]

n°34514
Amadeus
Posté le 26-05-2001 à 15:52:17  profilanswer
 

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]

n°34517
kadreg
profil: Utilisateur
Posté le 26-05-2001 à 16:00:21  profilanswer
 

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 !
n°34518
minusplus
Posté le 26-05-2001 à 16:03:54  profilanswer
 

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

n°34526
Amadeus
Posté le 26-05-2001 à 16:27:25  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
[Oracle] Question URGENTISSIME !! Vite ![C++] Tres Grands Débutants - Recherche nombres premiers
DELPHI URGENT !!!Question aux programmeurs JAVA... a propos de GEF...
C++, prog Win32, question simple de débutant ![VC++] question sur gethostbyaddr
Pour une question C++ qui m'interroge !Pb urgent en HTML et JavaScript
question existentialiste du developpeur !![javascript] tres tres simple !
Plus de sujets relatifs à : [C++] Très Urgent !!! Question de vie ou de ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR