template, qq chose m'échappe

template, qq chose m'échappe - C++ - Programmation

Marsh Posté le 26-10-2004 à 00:26:46    

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
Reply

Marsh Posté le 26-10-2004 à 00:26:46   

Reply

Marsh Posté le 26-10-2004 à 00:46:42    

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
Reply

Marsh Posté le 26-10-2004 à 02:22:46    

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

Reply

Marsh Posté le 26-10-2004 à 08:13:57    

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.

Reply

Marsh Posté le 26-10-2004 à 08:22:50    

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.

Reply

Marsh Posté le 26-10-2004 à 09:14:43    

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
 

Reply

Marsh Posté le 26-10-2004 à 10:04:11    

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
Reply

Marsh Posté le 26-10-2004 à 11:43:31    

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 ?

Reply

Marsh Posté le 27-10-2004 à 00:18:10    

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

Reply

Marsh Posté le 27-10-2004 à 01:44:04    

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
Reply

Marsh Posté le 27-10-2004 à 01:44:04   

Reply

Marsh Posté le 27-10-2004 à 02:14:49    

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


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

Sujets relatifs:

Leave a Replay

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