[Visual C++]Template

Template [Visual C++] - C++ - Programmation

Marsh Posté le 13-06-2005 à 16:02:34    

Salut,
J'ai des fichiers qui focntionnent tres bien avec gcc et un makefile sous linux mais sous visual C++ rien a faire j'ai des blemes dans tous les sens.
Voici un exemple pris sur le net que j'ai modifié (#include "Maillon.cpp" a la fin de Maillon.h):
Maillon.h :

Code :
  1. pragma once
  2. template <typename T>
  3. class Maillon
  4. {
  5.     T elem;
  6.     Maillon *suivant;
  7.     Maillon *precedent;
  8. public :
  9.    
  10. Maillon();
  11.     Maillon *LireSuivant (); 
  12.     Maillon *LirePrecedent ();
  13.     T LireElem();
  14.     void EcrireSuivant (Maillon *);
  15.     void EcrirePrecedent (Maillon *);
  16.     void EcrireElem (T);
  17. };
  18. #include "Maillon.cpp"


 
et Maillon.cpp :

Code :
  1. #include "Maillon.h"
  2. template <typename T>
  3. Maillon<T>::Maillon()
  4. {}
  5. template <typename T>
  6. Maillon<T>* Maillon<T> :: LireSuivant () 
  7.     {return suivant;}
  8. template <typename T>
  9. Maillon<T>* Maillon<T>:: LirePrecedent () 
  10.     {return precedent;}
  11. template <typename T>
  12. void Maillon<T> :: EcrireSuivant (Maillon *m)
  13.     {suivant=m;}
  14. template <typename T>
  15. void Maillon<T> :: EcrirePrecedent (Maillon *m)
  16.     {precedent=m;}


 
J'ai mis le fichier .cpp en : "Not Using Precompiled Headers"
et je me bouffe les erreurs :
 
d:\Projet GetInfo\src\test\Maillon.cpp(5): error C2995: 'Maillon<T>::Maillon(void)' : template function has already been defined
d:\Projet GetInfo\src\test\Maillon.cpp(9): error C2995: 'Maillon<T> *Maillon<T>::LireSuivant(void)' : template function has already been defined
d:\Projet GetInfo\src\test\Maillon.cpp(13): error C2995: 'Maillon<T> *Maillon<T>::LirePrecedent(void)' : template function has already been defined
d:\Projet GetInfo\src\test\Maillon.cpp(17): error C2995: 'void Maillon<T>::EcrireSuivant(Maillon<T> *)' : template function has already been defined
d:\Projet GetInfo\src\test\Maillon.cpp(21): error C2995: 'void Maillon<T>::EcrirePrecedent(Maillon<T> *)' : template function has already been defined
d:\Projet GetInfo\src\test\Maillon.cpp(25): error C2995: 'void Maillon<T>::EcrireElem(T)' : template function has already been defined
...
...
 
 
si je vire le include "Maillon.h" j'ai :
 
d:\Projet GetInfo\src\test\Maillon.cpp(3): error C2143: syntax error : missing ';' before '<'
d:\Projet GetInfo\src\test\Maillon.cpp(3): error C2501: 'Maillon' : missing storage-class or type specifiers
d:\Projet GetInfo\src\test\Maillon.cpp(3): error C2988: unrecognizable template declaration/definition
d:\Projet GetInfo\src\test\Maillon.cpp(8): error C2447: '{' : missing function header (old-style formal list?)
d:\Projet GetInfo\src\test\Maillon.cpp(7): error C2039: 'LireSuivant' : is not a member of 'operator``global namespace'''
d:\Projet GetInfo\src\test\Maillon.cpp(3): error C2059: syntax error : '<'
d:\Projet GetInfo\src\test\Maillon.cpp(8): error C2143: syntax error : missing ';' before '{'
...
...
 
 
Ca me soule, help me please :(
 
 
PS : je suis sous Visual studio .NET


Message édité par AsTro le 13-06-2005 à 16:04:26
Reply

Marsh Posté le 13-06-2005 à 16:02:34   

Reply

Marsh Posté le 13-06-2005 à 16:19:07    

il semble que ton .cpp est quand meme compilé separement, met une extension bidon pour voir

Reply

Marsh Posté le 13-06-2005 à 16:50:12    

J'ai renomé le .cpp en .cxx mais ca ne marche pas.
Il me dit tjrs que les focntions sont déjà définies :(

Reply

Marsh Posté le 13-06-2005 à 16:52:10    

bidon, on a dit :o
 
cxx, ça part à la compilation aussi :o  
 
tmpl par exemple :o


Message édité par elianor le 13-06-2005 à 16:52:33

---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 13-06-2005 à 17:05:56    

Ok ca marche avec une extension bidon.
Pourrais-je avoir une explication?
A quoi servent les .cxx alors?

Reply

Marsh Posté le 13-06-2005 à 17:14:56    

comme .cpp et .C (pas .c)

Reply

Marsh Posté le 13-06-2005 à 17:21:40    

skelter a écrit :

comme .cpp et .C (pas .c)


!?

Reply

Marsh Posté le 13-06-2005 à 17:23:28    

Pourqoui il ne faut pas que le fichier passe en compilation?
C'est pour qu'il passe à la compilation indirectement grace au include du .h et pas directement c'est ca?

Reply

Marsh Posté le 13-06-2005 à 17:24:17    

cxx, cpp, C sont des extensions pour sources C++

Reply

Marsh Posté le 13-06-2005 à 17:27:41    

AsTro a écrit :

Pourqoui il ne faut pas que le fichier passe en compilation?
C'est pour qu'il passe à la compilation indirectement grace au include du .h et pas directement c'est ca?


 
le code template doit etre connu pour chaque unité de compilation donc on le met habituelement dans le fichier d'entete ou on se dermerde pour qu'il s'y trouve apres passage du preprocesseur (comme tu fais)
si ton compilateur a la bonne idée de compiler en plus le .cpp tu auras multiple definition...


Message édité par skelter le 13-06-2005 à 17:28:23
Reply

Marsh Posté le 13-06-2005 à 17:27:41   

Reply

Marsh Posté le 13-06-2005 à 17:32:01    

Ok.
En fait je l'ai appellé .cxx et clique droit sur le fichier, propriété et Excluded From Build ---> yes.
 
Je sais pas quel solution est plus propre? (.tpl ou .cxx/cpp avec le excluded)

Reply

Marsh Posté le 13-06-2005 à 17:36:10    

dans ma libc++ ils utilisent .tcc, personnelement j'utiliserais autre chose que .cpp, .cxx

Reply

Marsh Posté le 13-06-2005 à 17:39:35    

L'avantage c'est la coloration syntaxique.

Reply

Marsh Posté le 13-06-2005 à 17:40:04    

nan mais c'est une blague ou quoi ?
 
template -> tout mettre dans .h. Toi tu coupes en 2 : t'as un pragma once (pas standard) pour ton .h, mais rien pour ton .cpp. Résultat ton .cpp est inclus 4000 fois.
 
donc soit :
- tu mets tout dans ton .h
- tu coupes en deux .h : l'un garde son .h, et l'autre, par convention on mets .tpp. Dans les deux cas, il faut mettre des gardiens d'inclusion multiples ...
 
 
Y a des jours, je me dis que vous vous en sortirez jamais ...

Reply

Marsh Posté le 13-06-2005 à 17:46:14    

arf je t'attendais taz ;)
 
C'est quoi que tu appelles les gardiens d'inclusion multiple?
Et le pragma once il faut le virer dans le 1er .h? Seulement dans le .tpp non?


Message édité par AsTro le 13-06-2005 à 17:48:21
Reply

Marsh Posté le 13-06-2005 à 17:51:50    

dans ton ce qui est un fichier d'entête (quelque soit l'extension), tu fais
 
#ifndef BLABLABAJJDHDHADHADKDJKAKC
#define BLABLABAJJDHDHADHADKDJKAKC
 
////
 
#endif // BLABLABAJJDHDHADHADKDJKAKC
 
où BLABLABAJJDHDHADHADKDJKAKC est un putain de motif bien compliqué et bien unique (pas STACK_H)

Reply

Sujets relatifs:

Leave a Replay

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