template, main, visual C++

template, main, visual C++ - C++ - Programmation

Marsh Posté le 30-10-2003 à 15:58:33    

Voila j'ai un main.cpp tout ce qu'il y a de plus simple :

Code :
  1. #include <iostream.h>
  2. #include "Element.h"
  3. int main(){
  4. Element<int> e1(3);
  5. return 0;
  6. }


je fais la classe élément en séparant  .h et  .cpp, ca plante lors de l'édition de lien(quand je fais "build" sous visual C++) :  
fichier : Element.h

Code :
  1. template<class T>
  2. class Element{
  3.   public:
  4. T valeur;
  5. Element<T>* ptr_succ;
  6. Element<T>* ptr_pred;
  7. Element(T val, Element<T>* succ = NULL, Element<T>* pred = NULL);
  8. virtual ~Element();
  9. };


 
fichier : Element.cpp

Code :
  1. template<class T> Element<T>::~Element(){
  2. delete ptr_succ;
  3. delete ptr_pred;
  4. }
  5. template<class T>
  6. Element<T>::Element(T val, Element<T>* succ, Element<T>* pred):valeur(val),ptr_succ(succ),ptr_pred(pred){};


En revanche si j'inclue le main dans le .cpp ca marche et je comprend pas pourquoi?
 
Message d'erreur :  
Linking...
main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall Element<int>::~Element<int>(void)" (??1?$Element@H@@UAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Element<int>::Element<int>(int,class Element<int> *,class Element<int> *)" (??0?$Element@H@@QAE@HPAV0@0@Z)
Debug/TP05_Ensemble.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

 

Reply

Marsh Posté le 30-10-2003 à 15:58:33   

Reply

Marsh Posté le 30-10-2003 à 17:04:51    

met tout ce qui est dans ton element.cpp dans ton element.h, à la suite de ce qui constitue réellement le header ...

Reply

Marsh Posté le 30-10-2003 à 17:18:52    

theShOcKwAvE a écrit :

met tout ce qui est dans ton element.cpp dans ton element.h, à la suite de ce qui constitue réellement le header ...


Pourquoi? c'est pas possible de séparer code source et header dans le cas des templates? merci en tout cas @+

Reply

Marsh Posté le 30-10-2003 à 19:38:36    

hum ... D'autres personnes y répondraient sans doute mieux que moi ...
 
Mais pour l'instant, considère que ce n'est pas possible (simplement parce que la majeure partie des compilateurs ne gèrent pas l'export, je crois ...)

Reply

Marsh Posté le 30-10-2003 à 21:29:20    

pas possible pour l'insatnt.
export et tres mal géré par les compilo donc mets ton code template dans ton .h

Reply

Marsh Posté le 30-10-2003 à 21:38:05    

Citation :

Catégorie : C++


bobmorton a écrit :


Code :
  1. #include <iostream.h>




[:meganne]


Message édité par Harkonnen le 30-10-2003 à 21:38:24

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-10-2003 à 21:39:38    

Ca marche avec CC sous solaris :o
 
 
 
 
(bon, il exporte tout et crée un répertoire temporaire avec des conchoncetés dedans)


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

Marsh Posté le 30-10-2003 à 21:41:47    

kadreg a écrit :

Ca marche avec CC sous solaris :o


il est de retour \o/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-10-2003 à 21:44:01    

Harkonnen a écrit :


il est de retour \o/


 
 
Commentaire hors sujet, [:ban]


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

Marsh Posté le 31-10-2003 à 09:27:26    

Harkonnen a écrit :

Citation :

Catégorie : C++


 
[:meganne]


certes, c'est parce que j'ai simplifier le code avant de poster. Merci bien en tout cas, et j'en place une pour ces profs sympathiques qui te disent "si si c'est possible l'erreur est ailleurs"...


Message édité par bobmorton le 31-10-2003 à 14:04:27
Reply

Marsh Posté le 31-10-2003 à 09:27:26   

Reply

Marsh Posté le 31-10-2003 à 13:44:31    

bobmorton a écrit :


certes, c'est parce que j'ai simplifier le code avant de poster. Merci bien en tout cas, et j'en place une pour ces putains de profs qui te disent "si si c'est possible l'erreur est ailleurs"...


 
si, c'est possible.
A la fin de ton .h dans lequel tu déclares ton template, tu inclues ton .cpp qui contient l'implémentation (#include "machin.cpp" )
 
Ca permet, pour ceux qui le souhaitent, de garder la séparation fonctionnelle entre les fichiers .h (header) et .cpp (implémentation).
 
Element.h:

Code :
  1. #ifndef TEMPLATE_ELEMENT_H
  2. template<class T> class Element
  3. {
  4.     // ... bla bla bla ...
  5. };
  6. #include "Element.cpp"
  7. #endif


 
 

Citation :

ces putains de profs


Etre vulgaire n'est ni une obligation ni une fatalité. Tu dois pouvoir t'en sortir.
 
 

Reply

Marsh Posté le 31-10-2003 à 13:49:41    

Joel F a écrit :

pas possible pour l'insatnt.
export et tres mal géré par les compilo donc mets ton code template dans ton .h

*
 
recherche google sur "why we can't afford export" pour plus d'info sur pkoi non seulement c'est mal géré mais en plus pkoi ca ne sera surement jamais géré :D

Reply

Marsh Posté le 01-11-2003 à 21:42:56    

je sais deja lu :p

Reply

Sujets relatifs:

Leave a Replay

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