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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°338910
marmotte.t​ranquille
Posté le 20-03-2003 à 19:50:44  profilanswer
 

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
mood
Publicité
Posté le 20-03-2003 à 19:50:44  profilanswer
 

n°338936
theshockwa​ve
I work at a firm named Koslow
Posté le 20-03-2003 à 20:28:38  profilanswer
 

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

n°338951
marmotte.t​ranquille
Posté le 20-03-2003 à 20:40:39  profilanswer
 

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
n°338959
Taz
bisounours-codeur
Posté le 20-03-2003 à 20:50:25  profilanswer
 

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

n°338965
Hercule
Posté le 20-03-2003 à 20:56:26  profilanswer
 

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


---------------
Ils veulent la jouer hard, on va la jouer hard  
n°338966
marmotte.t​ranquille
Posté le 20-03-2003 à 20:58:01  profilanswer
 

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

n°338968
Taz
bisounours-codeur
Posté le 20-03-2003 à 21:02:13  profilanswer
 

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

n°338969
theshockwa​ve
I work at a firm named Koslow
Posté le 20-03-2003 à 21:04:00  profilanswer
 

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
n°338973
Taz
bisounours-codeur
Posté le 20-03-2003 à 21:06:31  profilanswer
 

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

n°338976
marmotte.t​ranquille
Posté le 20-03-2003 à 21:08:23  profilanswer
 

[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:]

mood
Publicité
Posté le 20-03-2003 à 21:08:23  profilanswer
 

n°339319
Musaran
Cerveaulté
Posté le 21-03-2003 à 06:48:25  profilanswer
 

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
n°339326
SoWhatIn22
Posté le 21-03-2003 à 07:47:35  profilanswer
 

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

n°339553
Taz
bisounours-codeur
Posté le 21-03-2003 à 12:25:01  profilanswer
 

:heink:

n°340202
marmotte.t​ranquille
Posté le 21-03-2003 à 23:35:28  profilanswer
 

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


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

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

 

Sujets relatifs
[RESOLU] newb - pkoi cette erreur ???[résolu] ouvrir un fichier au travers d'HTTP
[C] parse error before '&' token [partiellement résolu]Pb de mysql.sock, c'est résolu merci
Java.lang.RunTime : marche, mais pas vraiment [résolu][mysql] Table crashée, REPAIR ? (résolu)
[resolu] methode close pour fermer le programmeSauvegarde de base de données (résolu)
Problème de focus... [Résolu] -- Script à emporter tout chaud...problème avec JTabbedPane [Résolu]
Plus de sujets relatifs à : [Resolu] [C++] template et Visual Studio 6.0


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