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

 


Dernière réponse
Sujet : [C++] question sur les templates
ayachi

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


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
ayachi

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

BENB 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.
LeGreg

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

ayachi

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.

BENB

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

El_gringo

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

chrisbk

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

BENB

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

chrisbk

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

BENB

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

godbout

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

minusplus

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

chrisbk

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

El_gringo

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 !

BENB

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

chrisbk

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

El_gringo 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...
chrisbk Zetes mauvais, l'API Win32 brute, c ca le mieux [:nofret]
El_gringo 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]

BENB

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

El_gringo 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...
El_gringo 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
BENB 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
El_gringo 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)
BENB

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]

El_gringo

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

BENB

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

El_gringo hummmm... ok ! désolé...
BENB

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

El_gringo

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

BENB

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;

ayachi ok donc pas de directive pour dire compile moi ce template pour le type int.
 
Merci bien
BENB Mis a part si ton compilo est un tromblon, c'est effectivement comme ca qu'il faut faire...
SoWhatIn22 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+
wpk

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]

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

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)