[Resolu] [C++] template et Visual Studio 6.0

template et Visual Studio 6.0 [Resolu] [C++] - C++ - Programmation

Marsh Posté le 20-03-2003 à 19:50:44    

Un bout de code est parfois plus simple pour expliquer le pb :
 
Matrice.h

Code :
  1. #ifndef MATRICE_H
  2. #define MATRICE_H
  3. #include <vector>
  4. template <class T>
  5. class Matrice
  6. {
  7. protected:
  8.  unsigned int nL,nC;
  9.  std::vector<T> donnees;
  10. public:
  11.  Matrice();
  12.  virtual ~Matrice();
  13. };
  14. #endif //MATRICE_H


 
 
Matrice.cpp

Code :
  1. #include "stdafx.h"
  2. #include "Matrice.h"
  3. //////////////////////////////////////////////////////////////////////
  4. // Construction/Destruction
  5. //////////////////////////////////////////////////////////////////////
  6. template<class T>
  7. Matrice<T>::Matrice()
  8. {
  9. nL = nC = 0;
  10. }
  11. template<class T>
  12. Matrice<T>::~Matrice()
  13. {
  14. donnees.clear();
  15. nC = nL = 0;
  16. }


 
et test.cpp

Code :
  1. #include "stdafx.h"
  2. #include "Matrice.h"
  3. int main(int argc, char* argv[])
  4. {
  5. Matrice<float> M;
  6. printf("Hello World!\n" );
  7. return 0;
  8. }


 
Resultat de compilation :
Compiling...
Matrice.cpp
test.cpp
Generating Code...
Linking...
test.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall Matrice<float>::~Matrice<float>(void)" (??1?$Matrice@M@@UAE@XZ)
test.obj : error LNK2001: unresolved external symbol "public: __thiscall Matrice<float>::Matrice<float>(void)" (??0?$Matrice@M@@QAE@XZ)
Debug/test.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
 
test.exe - 3 error(s), 0 warning(s)
 
Je croyais avoir capte les template, et du coup je ne vois pas d'ou ca vient. J'ai lu sur le forum qu'il y avait des pb avec la stl, les template et Visual Studio 6.0, ce probleme en fait-il partie ?
 
Merci


Message édité par marmotte.tranquille le 20-03-2003 à 21:37:42
Reply

Marsh Posté le 20-03-2003 à 19:50:44   

Reply

Marsh Posté le 20-03-2003 à 20:28:38    

Essaye déjà de passer les corps de tes fonctions dans le header, sous ta déf de classe ... ca devrait mieux passer ...

Reply

Marsh Posté le 20-03-2003 à 20:40:39    

theShOcKwAvE a écrit :

Essaye déjà de passer les corps de tes fonctions dans le header, sous ta déf de classe ... ca devrait mieux passer ...


 
Effectivement ca marche :D merci.
 
Par contre, je ne comprends pas pourquoi on ne peut pas effectuer les corps des fonctions dans le .cpp ...
 
Edit : Tiens un bizontin...


Message édité par marmotte.tranquille le 20-03-2003 à 20:43:13
Reply

Marsh Posté le 20-03-2003 à 20:50:25    

parce que c'est comme ça, les compilateur actuels sont incapables de faire cette division malgré le fait que la norme le prévoit via le mot clef export. donc, les templaes sont toujours déclarés et définis dans la meme unité de compilation

Reply

Marsh Posté le 20-03-2003 à 20:56:26    

J'avais réussit à le faire sous visual mais je me souviens plus comment...


---------------
Ils veulent la jouer hard, on va la jouer hard  
Reply

Marsh Posté le 20-03-2003 à 20:58:01    

Ok merci bcp pour cette explication. Par contre c'est bete parce que du coup on ne peut pas voir les erreurs des template a la compilation.
 
Et puis si je veux rajouter d'autres fonctions template, je dois les mettre aussi dans le header ? (ca va faire du gros header tout ca)
 
 

++Taz a écrit :

parce que c'est comme ça, les compilateur actuels sont incapables de faire cette division malgré le fait que la norme le prévoit via le mot clef export. donc, les templaes sont toujours déclarés et définis dans la meme unité de compilation

Reply

Marsh Posté le 20-03-2003 à 21:02:13    

marmotte.tranquille a écrit :

Ok merci bcp pour cette explication. Par contre c'est bete parce que du coup on ne peut pas voir les erreurs des template a la compilation.
 
Et puis si je veux rajouter d'autres fonctions template, je dois les mettre aussi dans le header ? (ca va faire du gros header tout ca)

ben il faut effectivement se faire un petit programme de test instanciant toutes les fonctions templates ou uiliser un compilo qui permet d'instancier tous les templates de manière automatique (Comeau par exemple)
 
le mieux: regarde les sources de la STL pour t'en convaincre

Reply

Marsh Posté le 20-03-2003 à 21:04:00    

un seul compilateur est capable de séparer la déclaration du corps des fonctions templates ... son nom m'échappe ... mais bon .. c'est sur qu'avec Visual, tu auras d'autres petits pépins si tu utilises des fonctions avancées des templates ...
 
perso, j'ai appris à mes dépends que la template specialization ne faisait pas bon ménage avec les MFC .... va savoir pourquoi ... ;)
 
-------------------------------
ouais, Bizontain, et alors ? ;)
Ne me dis pas que tu es le 'Marmotte' que je connais ! :D
 
Edit : Si tu es de Levier, je ne pense pas que ce soit toi ! tant pis ... ;)


Message édité par theshockwave le 20-03-2003 à 21:06:03
Reply

Marsh Posté le 20-03-2003 à 21:06:31    

un draft de l'ISO C++0x pour ceux que ça intéresse http://anubis.dkuug.dk/jtc1/sc22/w [...] /n1426.pdf

Reply

Marsh Posté le 20-03-2003 à 21:08:23    

[citation]
ouais, Bizontain, et alors ? ;)
Ne me dis pas que tu es le 'Marmotte' que je connais ! :D
[/citation]
 
Ben je ne pense pas. Je ne connais plus grand monde de Bezac...
 
En tout cas merci pour l'aide precieuse de tous [:hello:]

Reply

Marsh Posté le 20-03-2003 à 21:08:23   

Reply

Marsh Posté le 21-03-2003 à 06:48:25    

Un patron va dans un en-tête car malgré les apparences ils n'est pas du code compilable, mais un générateur de code compilable.
Ses instructions n'ont pas de sens défini tant qu'on ne précise pas ses types en l'appelant.
 
 
Une autre façon de faire:
f.hpp

Code :
  1. template<class T> void f(T); //patron de déclaration partagée

f.cpp

Code :
  1. template<class T> void f(T) {} //patron de définition
  2. template void f<int>(int ); //instanciation avec type explicite
  3. template void f     (char); //instanciation avec type implicite

La fonction patronéee n'est compilée qu'une fois, mais le patron ne marche que pour les types explicitements prévus.
 
 

theShOcKwAvE a écrit :

un seul compilateur est capable de séparer la déclaration du corps des fonctions templates ... son nom m'échappe

http://www.comeaucomputing.com Le seul à supporter "export".
Ce qui est de peu d'intérêt en fait: Export Restrictions, Part 1


Message édité par Musaran le 21-03-2003 à 06:49:17

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 21-03-2003 à 07:47:35    

marmotte.tranquille a écrit :


Et puis si je veux rajouter d'autres fonctions template, je dois les mettre aussi dans le header ? (ca va faire du gros header tout ca)


 
Ce que l'on fait souvent:
 

Code :
  1. // header: mon_template.hpp
  2. template <class T>
  3. class Matrice
  4. {
  5.    /// bla bla bla...
  6. };
  7. #include "mon_template.cpp"


 
comme cela, tu gardes quand même ton découpage. Cela revient au même, mais ca peut aider à la lisibilité.

Reply

Marsh Posté le 21-03-2003 à 12:25:01    

:heink:

Reply

Marsh Posté le 21-03-2003 à 23:35:28    

-> sowhatin22
Mouais, etant donne l'explication de Musaran (ce n'est pas du code compilable mais generateur de code compilable), je ne suis pas sur que ce soit une bonne idee. Apres je ne vais plus faire la difference entre code "normal" et template. Et puis ca me fait bizarre de mettre un #include "truc.cpp" dans un header. Mais merci du conseil tout de meme :)
 
-> Musaran
Merci beaucoup pour cette explication, je comprends mieux maintenant

Reply

Sujets relatifs:

Leave a Replay

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