[DevC++] problème de compilation avec des templates

problème de compilation avec des templates [DevC++] - C++ - Programmation

Marsh Posté le 16-11-2004 à 20:33:33    

Bonjour,
je voudrais compiler un simple programme en c++, mais je m'y perd dans la gestion des fichiers.
Voici un exemple simplifié:
J'ai 3 fichiers:
main.cpp

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include "test.h"
  4. using namespace std;
  5. int main(int argc, char *argv[])
  6. {
  7.   Test<int> a;
  8.   a.brol();
  9.   system("PAUSE" );
  10.   return 0;
  11. }


 
puis test.h
 

Code :
  1. #ifndef _TEST_H
  2. #define _TEST_H
  3. template<class A>
  4. class Test
  5. {
  6.     private:
  7.         A pwet;
  8.     public:
  9.         void brol();
  10. };
  11. #endif


 
puis test.cpp:
 

Code :
  1. #include "test.h"
  2. template<class A>
  3. void Test<A>::brol()
  4. {
  5.     pwet = 0;
  6. }


 
Et j'obtiens a la compil:
 

Compilateur: Default compiler
Building Makefile: "C:\Dev-Cpp\Makefile.win"
Exécution de  make clean
rm -f main.o test.o  Projet1.exe
 
g++.exe -c main.cpp -o main.o  
 
g++.exe -c test.cpp -o test.o  
 
g++.exe main.o test.o  -o "Projet1.exe" -L"C:/map/Dev-Cpp/lib"    
 
main.o(.text+0x1b):main.cpp: undefined reference to `Test<int>::brol(void)'
 
make.exe: *** [Projet1.exe] Error 1
 
Exécution terminée


 
Or, si j'utilise pas de template, ca marche, et si je fais include "test.cpp" dans main.cpp ca marche aussi, comment suis je sensé procédé pour que ca soit valide?
merci d'avance  :jap:


Message édité par Nico5779 le 16-11-2004 à 20:34:46
Reply

Marsh Posté le 16-11-2004 à 20:33:33   

Reply

Marsh Posté le 16-11-2004 à 20:41:43    

Pour l'instant, il faut mettre l'implémentation des fonctions templates dans le .h, pour qu'elle soit visible par le code qui l'utilise en l'instanciant.  
 
Un jour, peut-être, tous les compilos C++ du monde auront des librairies de templates, et on pourra faire du générique comme en ADA...

Reply

Marsh Posté le 16-11-2004 à 20:42:54    

_TEST_H
 
 
t'as pas plus unique comme identifiant ?
 
pour les template, il faut utiliser le modèle de l'inclusion. Donc ne fait pas de .cpp associer, fout tout dans le .hpp

Reply

Marsh Posté le 16-11-2004 à 20:42:59    

Reply

Marsh Posté le 16-11-2004 à 20:52:04    

merci pour ce lien Lam's, mais j'ai juste essayer de router "export" devant un template, et ca ma mis :
 
 
test.h:3: warning: keyword 'export' not implemented and will be ignored
 
 
Je suis donc sensé tout mettre dans un seul fichier.
Taz> qd tu dit "modèle de l'inclusion" ca veut dire quoi concretement, je mets pas de directive particulière dans le fichier .hpp et je fais direct le include "test.hpp" dans le main.cpp c bien ca?


Message édité par Nico5779 le 16-11-2004 à 20:52:26
Reply

Marsh Posté le 16-11-2004 à 20:55:00    

oui

Reply

Marsh Posté le 16-11-2004 à 20:55:08    

Nico5779 a écrit :

test.h:3: warning: keyword 'export' not implemented and will be ignored
 
Je suis donc sensé tout mettre dans un seul fichier.


Bah oui, y a que des grosses boites comme EDG (3 personnes en tout, et le front-end est codé en C) qui peuvent se permettre de passer leur temps à implémenter toute la norme.
 
Le front-end d'EDG est utilisé par le compilateur Comeau, mais aussi par le compilo d'Intel entre autres. Il paraitrait que export serait au programme de l'équipe de Visual C++...

Reply

Marsh Posté le 16-11-2004 à 20:59:58    

oki merci.
Lams> c pas de bol, je compte n'utiliser que g++ :/

Reply

Marsh Posté le 16-11-2004 à 21:25:23    

y a pas de quoi en faire un fromage. g++ fonctionne bien, et export n'est pas essentiel et souvent controversé

Reply

Marsh Posté le 16-11-2004 à 22:48:58    

On peut faire #include<test.cpp> également... histoire de conserver ses deux fichiers ?


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 16-11-2004 à 22:48:58   

Reply

Marsh Posté le 16-11-2004 à 23:09:05    

c'est moche. à ce moment là, certains utilise une extension .tpp pour pas prêter à confusion.

Reply

Marsh Posté le 18-11-2004 à 13:26:39    

Lam's a écrit :

Pour l'instant, il faut mettre l'implémentation des fonctions templates dans le .h, pour qu'elle soit visible par le code qui l'utilise en l'instanciant.  


 
Ouep c'est ça, pb classique unix...

Reply

Marsh Posté le 18-11-2004 à 13:28:11    

xterminhate a écrit :

On peut faire #include<test.cpp> également... histoire de conserver ses deux fichiers ?


 
Oui tout à fait. Moi je bosse sur des applis multi-platforme, et on a des jolis #ifdef pour faire une inclusion conditionnel de l'implémentation des template quand on est sous unix.

Reply

Sujets relatifs:

Leave a Replay

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