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

  FORUM HardWare.fr
  Programmation
  C++

  template, qq chose m'échappe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

template, qq chose m'échappe

n°882711
el muchach​o
Comfortably Numb
Posté le 26-10-2004 à 00:26:46  profilanswer
 

Alors ouala, j'ai codé une petite class template tranquillou dans mon coin :
 
template<typename T> class maClasse {
  maClasse(T) {}
  ~maClasse;
...
};
 
Pis j'ai déclaré dans un global.h quelques variables globales (oui je sais, ça rime avec "çay mal" ):
 

Code :
  1. namespace yo {
  2.   typedef maClasse<int> maClasse_dint;
  3.   typedef maClasse<truc> maClasse_detruc;
  4.   extern maClasse_dint hop;
  5.   extern maClasse_detruc hophop;
  6. }


 
Puis dans un .cpp, j'ai voulu faire un truc du genre :
 

Code :
  1. #include "global.h"
  2. namespace yo {
  3.  
  4.   fonction_quelconque()
  5.   { // notez que les instanciations se font à l'intérieur de la fonction
  6.     T chose;
  7.     maClasse_dint hop(3);
  8.     maClasse_detruc hophop(chose);
  9.     ...
  10.   }
  11. }


Et là, le linker, il est pas content.  
Il me dit qu'il ne connait pas les types maClasse_dint et maClasse_detruc.
 
Par contre, si je fais :

Code :
  1. #include "global.h"
  2. namespace yo {
  3.   // instanciations dans une portée globale
  4.   maClasse_dint hop(3);
  5.   maClasse_detruc hophop(chose);
  6.   fonction_quelconque()
  7.   {
  8.     ...
  9.   }
  10. }


 
là, ça roule, le linker il est content. [:itm]  
Ma question : Pourquoi donc ?
 
(j'espère n'avoir rien oublié)


Message édité par el muchacho le 26-10-2004 à 00:31:13
mood
Publicité
Posté le 26-10-2004 à 00:26:46  profilanswer
 

n°882723
HelloWorld
Salut tout le monde!
Posté le 26-10-2004 à 00:46:42  profilanswer
 

Ca compile nickel mais ça passe pas à l'édition de liens c'est ça ?
Apres j'ai pas pigé l'histoire du global. T'as déclarés 2 variables locales (sur la pile) dans fonction_quelconque. Tu t'attends à quoi ? Et même en static, leur portée est celle du bloc de la fonction. Sinon t'imagines le truc, déclarer des pointeurs sur des variable statiques de fonctions, le effets de bord fouarreux...

Code :
  1. maClasse_dint & get_hop()
  2. {
  3.     static maClasse_dint hop(3);
  4.     return hop;
  5. }


et y'a plus de variable globale :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°882740
Taz
bisounours-codeur
Posté le 26-10-2004 à 02:22:46  profilanswer
 

extern ça veut dire "ce machin là existe, mais te préoccupe de l'allocation / init, quelqu'un d'autre le fait déjà ailleurs"
 
si y a pas d'ailleurs ...

n°882775
el muchach​o
Comfortably Numb
Posté le 26-10-2004 à 08:13:57  profilanswer
 

HelloWorld a écrit :

Ca compile nickel mais ça passe pas à l'édition de liens c'est ça ?


Oui, c'est ça.

Citation :


Apres j'ai pas pigé l'histoire du global. T'as déclarés 2 variables locales (sur la pile) dans fonction_quelconque. Tu t'attends à quoi ? Et même en static, leur portée est celle du bloc de la fonction. Sinon t'imagines le truc, déclarer des pointeurs sur des variable statiques de fonctions, le effets de bord fouarreux...


En fait, les variables ne sont pas censées être locales, vu qu'elles sont déclarées extern dans global.h, qui est inclus en tête de plusieurs unités de compilation (enfin c'est ce que je pensais).
 

Code :
  1. maClasse_dint & get_hop()
  2. {
  3.     static maClasse_dint hop(3);
  4.     return hop;
  5. }


et y'a plus de variable globale :)
[/citation]
 
Il me semble que c'est ce que j'avais commencé par faire, mais je vais réessayer.

n°882776
el muchach​o
Comfortably Numb
Posté le 26-10-2004 à 08:22:50  profilanswer
 

Taz a écrit :

extern ça veut dire "ce machin là existe, mais te préoccupe de l'allocation / init, quelqu'un d'autre le fait déjà ailleurs"
 
si y a pas d'ailleurs ...


 
Ben dans les deux cas, il y a allocation, le premier cas à l'intérieur de la fonction. En mettant les arguments d'un constructeur
 
   maClasse_dint hop(3);
   maClasse_detruc hophop(chose);
 
en dehors de la fonction (portée globale), - donc a priori il y a instanciation/allocation de la classe -, et d'ailleurs, ça marche.
Par contre, si je fais ça à l'intérieur de la fonction, il semble que les types paramétrés définis en extern ne soit pas connus.
Pourquoi, c'est ce que je ne pige pas.

n°882804
Lam's
Profil: bas.
Posté le 26-10-2004 à 09:14:43  profilanswer
 

el muchacho a écrit :

Ben dans les deux cas, il y a allocation


Il y a allocation, mais la définition n'est pas la bonne puisque tu déclares en fait une variable homonyme dans le scope de ta fonction.
 
On reprend les basiques : dans ton .h, tu as fait la déclaration d'un extern. Tu as donc dit au compilo pour ces variables là :  un jour, un grand brun ténébreux viendra et te dira où elles sont. Le compilo attend donc une définition de ces variables (ie. où sont elles en mémoire). Plus précisemment, il attend une définition dans le tas, au niveau du bon namespace.  
 
Or, ce que tu lui donnes, c'est une nouvelle déclaration (ainsi que sa définition) dans une fonction, dans la pile. Le compilo ne s'en sert donc pas pour résoudre les variables globales.  
 
Dans l'ancien temps, on disait que ces variables étaient automatiques:
http://msdn.microsoft.com/library/ [...] ions_4.asp
 

n°882862
HelloWorld
Salut tout le monde!
Posté le 26-10-2004 à 10:04:11  profilanswer
 

Qui eût cru qu'un jour on donnerait la msdn en référence sur le C++. Ca laisse libre à tous les fantasmes sur le futur des technologies MS... :lol:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°882948
Taz
bisounours-codeur
Posté le 26-10-2004 à 11:43:31  profilanswer
 

el muchacho a écrit :

Ben dans les deux cas, il y a allocation, le premier cas à l'intérieur de la fonction.
 
en dehors de la fonction (portée globale), - donc a priori il y a instanciation/allocation de la classe -,

t'es sous médicament ?

n°883606
el muchach​o
Comfortably Numb
Posté le 27-10-2004 à 00:18:10  profilanswer
 

Lam's a écrit :

Il y a allocation, mais la définition n'est pas la bonne puisque tu déclares en fait une variable homonyme dans le scope de ta fonction.
 


 
Oh putain... [:totoz] on va mettre ça sur le compte de la fatigue, hein...

n°883623
HelloWorld
Salut tout le monde!
Posté le 27-10-2004 à 01:44:04  profilanswer
 

Je dirais qu'il tente de la déclarer.
=> un alias vers une variable dont la portée est restreinte à celle d'une fonction. C'est mieux ? :)
Quoique sur alias j'ai un doute. C'est bien la variable elle même qu'il déclare (sans définir), et non un alias ou un homonyme ?
En gros d'un côté tu déclares une variable globale, de l'autre locale à une fonction. Cherche l'erreur...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 27-10-2004 à 01:44:04  profilanswer
 

n°883625
nraynaud
lol
Posté le 27-10-2004 à 02:14:49  profilanswer
 

tu peux virer tous tes trucs de C++, c'est un pb de C là.
 


---------------
trainoo.com, c'est fini

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

  template, qq chose m'échappe

 

Sujets relatifs
[HTML] Tableau : un truc m'échappeproblem template et héritage
fonction template dans une classe template[C++/template] Eléments syntaxiques en paramètres template ?
J'ai de la peine entre value-of et apply-template[C++/COM] Il me manque quelque chose...
[c++] export template...Template ou XSLT
probleme template[CSS] Comment éviter de tel chose si horrible ?! [Résolu]
Plus de sujets relatifs à : template, qq chose m'échappe


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