[C++] question sur les templates

question sur les templates [C++] - Programmation

Marsh Posté le 03-12-2001 à 04:00:57    

y'a t-il moyen d'écrire des templates avec la déclaration dans un header et l'implémentation dans un .cpp ?
 
Par exemple
dans le .h
template<typename T> class test
{ public :
  T get( );
private:  
  T valeur;
}
 
dans le .cpp
template<typename T> T test<T>::get( )
{
   return T;
}
 
dans le main.cpp
#include "test.h"
void main( )
{
   test<int> x;
 
   int i = x.get( );
}
 
normalement le linker dit que le qu'il ne trouve pas
int test<int>::get( ), normal car le compilo ne compile
du code basé sur template que si on l'utilise.
Comment faire pour l'obliger à compiler le test.cpp pour int ?

Reply

Marsh Posté le 03-12-2001 à 04:00:57   

Reply

Marsh Posté le 03-12-2001 à 08:38:21    

ayachi a écrit a écrit :

y'a t-il moyen d'écrire des templates avec la déclaration dans un header et l'implémentation dans un .cpp ?
 
Par exemple
dans le .h
template<typename T> class test
{ public :
  T get( );
private:  
  T valeur;
}
 
dans le .cpp
template<typename T> T test<T>::get( )
{
   return T;
}

 
dans le main.cpp
#include "test.h"
void main( )
{
   test<int> x;
 
   int i = x.get( );
}
 
normalement le linker dit que le qu'il ne trouve pas
int test<int>::get( ), normal car le compilo ne compile
du code basé sur template que si on l'utilise.
Comment faire pour l'obliger à compiler le test.cpp pour int ?  




 
reponse : non supprime le code du cpp pour le template et met le à la suite de la declaration ds le .h ...
 
à la limite tu peux faire ds le .h un include du cpp du template

 

[edtdd]--Message édité par wpk--[/edtdd]

Reply

Marsh Posté le 03-12-2001 à 08:44:25    

hello,
 
tu peux tout à fait laisser ton code dans le fichier .cpp.
Mais à ce moment là, après la déclaration de la classe, il faut que tu fasses un #include "monfichier.cpp"
c'est ce que je fais, et cela fonctionne très bien (comme le dit wpk aussi).
 
Il faut forcément que le code soit rattaché au header. C'est comme ça, et je n'ai pas envie de me lancer dans des grandes explication tôt le matin ;)
 
a+

Reply

Marsh Posté le 03-12-2001 à 09:51:46    

Mis a part si ton compilo est un tromblon, c'est effectivement comme ca qu'il faut faire...

Reply

Marsh Posté le 03-12-2001 à 23:21:56    

ok donc pas de directive pour dire compile moi ce template pour le type int.
 
Merci bien

Reply

Marsh Posté le 04-12-2001 à 10:48:10    

ayachi a écrit a écrit :

ok donc pas de directive pour dire compile moi ce template pour le type int.
 
Merci bien  




Si tu veux tu peux faire une instanciation explicite:
class test<int>;
ou mieux
typedef test<int> testint;

Reply

Marsh Posté le 04-12-2001 à 10:57:25    

BENB a écrit a écrit :

 
Si tu veux tu peux faire une instanciation explicite:
class test<int>;
ou mieux
typedef test<int> testint;  




 
pourquoi "mieux" !? vu que c la même chose...

Reply

Marsh Posté le 04-12-2001 à 11:03:44    

El_Gringo a écrit a écrit :

 
 
pourquoi "mieux" !? vu que c la même chose...  




C'est pas la meme chose ca defini un synonyme plus facile a utiliser...

Reply

Marsh Posté le 04-12-2001 à 11:05:04    

hummmm... ok ! désolé...

Reply

Marsh Posté le 04-12-2001 à 11:06:46    

El_Gringo a écrit a écrit :

hummmm... ok ! désolé...  




C'est pas grave...
Mais avoir le dernier mot face a moi...
Tu aurras du mal :D (j'ai des predispositions naturelles ;) )

Reply

Marsh Posté le 04-12-2001 à 11:06:46   

Reply

Marsh Posté le 04-12-2001 à 11:08:37    

BENB a écrit a écrit :

 
C'est pas grave...
Mais avoir le dernier mot face a moi...
Tu aurras du mal :D (j'ai des predispositions naturelles ;) )  




 
sur la STL, j'en doute pas !
Mais sur les MFC, j'te prend quand tu veux :D

Reply

Marsh Posté le 04-12-2001 à 11:11:19    

El_Gringo a écrit a écrit :

 
 
sur la STL, j'en doute pas !
Mais sur les MFC, j'te prend quand tu veux :D  




Les MFC c'est quoi ca ?
Tu parles de cet infame embrouillamini qui copie palement wxWindows ? (j'y vais peut-etre un peu fort la :D )
Honnetement jette un coup d'oeil a wxWindows, et les MFC te paraitrons bien fades...
 
Et puis arrete de me dire comme ca que tu es prets a me prendre ca pourrait faire jazzer :sarcastic:  
De plus je suis mariee, et si tu veux je te presente mon mari...
Il a ete pillier de rugby :D

 

[edtdd]--Message édité par BENB--[/edtdd]

Reply

Marsh Posté le 04-12-2001 à 11:15:17    

tu critiques, tu critiques, ms je suis sur que t'as presque jammais essayé... que des a prioris anti-billesques (puisque t'as inventé l'adjectif, autant s'en servir, c vrai qu'il est pratique :D)

Reply

Marsh Posté le 04-12-2001 à 11:17:48    

Il y a lontemps, mais juste des CArray, et pas trop...
 
Par contre des que j'ai le temps je me plonge dans wxWindows qui me parait bcp mieux, ne serait-ce que par le cote portabilite...
 
Et franchement, je crois que tu peux imaginer des MFC ou les classes commencent par wx au lieu de C :D

Reply

Marsh Posté le 04-12-2001 à 11:21:13    

t'aimes ça la portabilité toi... moi je t'ai déja dis, je m'en tape. Donc, je connais les MFC, ça marche très bien ! je vais pas chercher plus loin...
Sinon, disons que je te prend pas alors... enfin, moi j'disais ça comme ça ! tu dis pas à ton mari hein !? :D

Reply

Marsh Posté le 04-12-2001 à 11:21:57    

et puis, je pensais pas qu'y serai jaloux si tu vas programmer avec quelqu'un d'autre... l'adultère informatique, y a plus grave...

Reply

Marsh Posté le 04-12-2001 à 11:23:31    

El_Gringo a écrit a écrit :

et puis, je pensais pas qu'y serai jaloux si tu vas programmer avec quelqu'un d'autre... l'adultère informatique, y a plus grave...  




Lui il serait plutot refractaire a l'informatique...
enfin sauf quand je lui sort ces courbes de perfs de ses pompes :D

Reply

Marsh Posté le 04-12-2001 à 11:26:15    

Comme t'en parle, il à l'aire dans le genre "brute épaisse", je m'demande si je suis pas en danger en m'adressant directement à toi ici...
En fait, je serai incapable de te donner un age... enfin, d'après ta maturité C++esque, je dirais... au moins 35 non !?:D

 

[edtdd]--Message édité par El_Gringo--[/edtdd]

Reply

Marsh Posté le 04-12-2001 à 11:26:24    

Zetes mauvais, l'API Win32 brute, c ca le mieux [:nofret]

Reply

Marsh Posté le 04-12-2001 à 11:30:04    

Par contre, j'avoue, là je jette un oeil à wxWindows, ça à l'aire carrément plus complet que les MFC's  :jap:  
Saloperie de Microsoft, c à cause d'eux que je connais que les MFC...

Reply

Marsh Posté le 04-12-2001 à 11:31:22    

El_Gringo a écrit a écrit :

Par contre, j'avoue, là je jette un oeil à wxWindows, ça à l'aire carrément plus complet que les MFC's  :jap:  
Saloperie de Microsoft, c à cause d'eux que je connais que les MFC...  




 
pourquoi ils sont fait quoi encore ? ils ont pirate ton IE pour qu'il plante sur les site de wxWindows ? :D

Reply

Marsh Posté le 04-12-2001 à 11:33:50    

El_Gringo a écrit a écrit :

Comme t'en parle, il à l'aire dans le genre "brute épaisse", je m'demande si je suis pas en danger en m'adressant directement à toi ici...
En fait, je serai incapable de te donner un age... enfin, d'après ta maturité C++esque, je dirais... au moins 35 non !?:D  
 
 




On ne demande pas son age a une dame...
Aller bon, juste pour te narguer :D
J'ai 30 ans, deux enfants, et un mari qui peut passer pour une brute epaisse :D...
Et je ne suis informaticienne de formation mais chimiste (enfin on va dire chimiste ce sera plus simple) :D
Comme mon mari

Reply

Marsh Posté le 04-12-2001 à 11:34:58    

chrisbk a écrit a écrit :

 
 
pourquoi ils sont fait quoi encore ? ils ont pirate ton IE pour qu'il plante sur les site de wxWindows ? :D  




 
J'vais quand même pas dire que c pas faute ! (il est fou lui :D)
 
ms plus sérieusement, quand tu bosses avec VC++ et les MSDN, ils se débrouille pour que tu penses que la MFC c le top, et que c d'ailleur le seul truc  qui permette de faire ce pour quoi c'est fait !

Reply

Marsh Posté le 04-12-2001 à 11:36:58    

El_Gringo a écrit a écrit :

 
 
J'vais quand même pas dire que c pas faute ! (il est fou lui :D)
 
ms plus sérieusement, quand tu bosses avec VC++ et les MSDN, ils se débrouille pour que tu penses que la MFC c le top, et que c d'ailleur le seul truc  qui permette de faire ce pour quoi c'est fait !  




 
 
bah dis logique, il fait sa pub :D Enfin quoi, il fait pas dans l'humanitaire, le billou :D

Reply

Marsh Posté le 04-12-2001 à 11:38:18    

BENB a écrit a écrit :

 
On ne demande pas son age a une dame...  
Aller bon, juste pour te narguer :D  
J'ai 30 ans, deux enfants, et un mari qui peut passer pour une brute epaisse :D...  
Et je ne suis informaticienne de formation mais chimiste (enfin on va dire chimiste ce sera plus simple) :D  
Comme mon mari  




vous vous êtes rencontrés à la lumière d'un bec bunsen ?  
 
:D

Reply

Marsh Posté le 04-12-2001 à 11:38:59    

minusplus a écrit a écrit :

 
vous vous êtes rencontrés à la lumière d'un bec bunsen ?  
 
:D  




 
merde et moi qui voulait pas deranger en disant une connerie :D

Reply

Marsh Posté le 04-12-2001 à 11:42:05    

El_Gringo a écrit a écrit :

 
 
J'vais quand même pas dire que c pas faute ! (il est fou lui :D)
 
ms plus sérieusement, quand tu bosses avec VC++ et les MSDN, ils se débrouille pour que tu penses que la MFC c le top, et que c d'ailleur le seul truc  qui permette de faire ce pour quoi c'est fait !  




C'est leur produit, c'est normal qu'il le mettent en avant...
Et je ne dis pas tant que ce n'est pas bien, mais...
 
Le principal reproche que je fasse au MFC comme a Win32 c'est de deformer completement le code, a tel point que le portage d'un appli Win vers Unix devient trea dur car il ne suffit pas de changer l'interface, car avaec les MFC tu a tendance a tout melanger...
 
Aujourd'hui le portage te parait secondaire, mais la monte de Linux va sans doute changer la donne. Dans le monde la simulation les stations Unix (HP - SUN) sont encore tres presente, et la possibilite d'avoir un meme code pour toute les plateformes est precieux...

Reply

Marsh Posté le 04-12-2001 à 11:43:20    

BENB a écrit a écrit :

 
Aujourd'hui le portage te parait secondaire, mais la monte de Linux va sans doute changer la donne




 
ca fait quand meme deja qqes annees que j'entend ca et je vois tjs rien venir... (pas que ca me derange, d'ailleurs..)

Reply

Marsh Posté le 04-12-2001 à 11:45:00    

minusplus a écrit a écrit :

 
vous vous êtes rencontrés à la lumière d'un bec bunsen ?  
 
:D  




:lol:  
Alors c'etait lui qui le tenait, parce que moi avec des cinq pouces sur chacune de mes deux mains gauches :D
 
Mais oui, on c'est rencontre a l'ecole, mais c'est une longue histoire (il a eu du courage) que j'ai deja du raconter sur Bla-Bla :D

Reply

Marsh Posté le 04-12-2001 à 11:45:30    

BENB a écrit a écrit :

 
Mais oui, on c'est rencontre a l'ecole, mais c'est une longue histoire (il a eu du courage) que j'ai deja du raconter sur Bla-Bla :D  




 
le lien ! le lien ! :D

Reply

Marsh Posté le 04-12-2001 à 11:46:33    

BENB a écrit a écrit :

 
C'est leur produit, c'est normal qu'il le mettent en avant...
Et je ne dis pas tant que ce n'est pas bien, mais...
 
Le principal reproche que je fasse au MFC comme a Win32 c'est de deformer completement le code, a tel point que le portage d'un appli Win vers Unix devient trea dur car il ne suffit pas de changer l'interface, car avaec les MFC tu a tendance a tout melanger...
 
Aujourd'hui le portage te parait secondaire, mais la monte de Linux va sans doute changer la donne. Dans le monde la simulation les stations Unix (HP - SUN) sont encore tres presente, et la possibilite d'avoir un meme code pour toute les plateformes est precieux...  




 
Mais c Normal, les MFC, c pas utilisé uniquement comme des classes fonctionnelles ou pour l'interface graphique. Quand on utilise bien les MFC, on le fait complètement, et à ce moment là, toute la structure de l'application est MFC. MFC, c une façon de programmer...

Reply

Marsh Posté le 04-12-2001 à 11:48:42    

chrisbk a écrit a écrit :

 
 
ca fait quand meme deja qqes annees que j'entend ca et je vois tjs rien venir... (pas que ca me derange, d'ailleurs..)  




Ben la je trouve que ca commence a venir, et je vois la boite pour laquelle je vais bosser apres mes conges maternite propose ses produits pour stations HP/SUN/Linux/WIN...
 
et avec la monte en puissance des PC face aux stations ca fait une offre particulierement concurentielle...

Reply

Marsh Posté le 04-12-2001 à 21:09:03    

BENB a écrit a écrit :

 
Si tu veux tu peux faire une instanciation explicite:
class test<int>;
ou mieux
typedef test<int> testint;  




 
ça marchera pas ( et j'ai vérifié quand même ) car même les méthodes ne seront compilées que si on les utilisent.
 
par exemple
dans le test6.h
template<typename Type> class test6
{
 public:
  test6( const Type& t );
 
  Type get( );
 
 private:
  Type val;
};
 
#include "test6.h"
 
 
Dans le test6.cpp
template<typename Type> test6<Type>::test6( const Type& t )
{
 this->val = t;
}
 
template<typename Type> Type test6<Type>::get( )
{
 return val;
}
 
class test6<int>;
 
 
dans le main.cpp
#include "test6.h"
void main( )
{
 int i = 0;
 test6<int> t( 5 );
 
 i = t.get( );
 
}
 
le linker va me dire que le test6<int>::get( ) n'est pas disponible.

Reply

Marsh Posté le 05-12-2001 à 11:57:54    

ayachi a écrit a écrit :

 
ça marchera pas ( et j'ai vérifié quand même ) car même les méthodes ne seront compilées que si on les utilisent.
dans le main.cpp
#include "test6.h"
void main( )
{
 int i = 0;
 test6<int> t( 5 );
 
 i = t.get( );
 
}
le linker va me dire que le test6<int>::get( ) n'est pas disponible.  




 
j'crois que tu n'as pas bien compris
il s'agit d'instancier un template ici  
et pas une classe
(le template = classe de class, c'est clair non :D ?)  
Si tu forces l'instanciation de ton template
avec le typdef par exemple
il va creer le code objet que ton linker pourra
linker.
Et il faut l'appeler par son nouveau nom, hein !
pas par l'ancien sinon il va cherche le code de ton
template !
 
A+
LEGREG

Reply

Marsh Posté le 05-12-2001 à 13:30:32    

Meme si tu l'instancie, il faut que le code soit dans les headers...  
le fait de l'instancier ameliore les choses quand tu utilise les templates dans des situations compliquees.

Reply

Marsh Posté le 05-12-2001 à 17:35:08    

legreg a écrit a écrit :

 
 
j'crois que tu n'as pas bien compris
il s'agit d'instancier un template ici  
et pas une classe
(le template = classe de class, c'est clair non :D ?)  
Si tu forces l'instanciation de ton template
avec le typdef par exemple
il va creer le code objet que ton linker pourra
linker.
 
Et il faut l'appeler par son nouveau nom, hein !
pas par l'ancien sinon il va cherche le code de ton
template !
 
A+
LEGREG  




 
oui mais il ne va pas générée le code pour les membres, il faudrait que dans le cpp je l'utilise! et quand le linker linkera main.obj et test6.obj il trouvera pas dans test6.obj
le test6<int>::get()
enfin c'est bon j'ai vu l'eexemple d'atl et effectivement  
y'a pas moyen de t'en sortir, le code doit être inclu d'une façon ou une autre dans le main.cpp
 
Merci à tous :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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