un map<> static dans une classe ?

un map<> static dans une classe ? - C++ - Programmation

Marsh Posté le 19-11-2004 à 18:14:51    

Salut
 
Je cherche désespérement à ajouter un map<string, T> à une classe qui serait un état de classe, donc un élément statique pour cet classe.
 
La classe fonctionne très bien tant que je ne le déclare pas en static.
cet élément, c'est instances.
 
Avec le static, ca passe bien à la compilation, mais le linkage merde après...
Je comprends pas du tout.
 
Si je retire la gestion des templates et que je la remplace par une classe quelconque, ca change rien. Toujours le même comportement
 
Une idée ?
 
Lelfe
 

Code :
  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4. template <class T>
  5. class Saveable
  6. {
  7. private:
  8.  typedef std::map<string, T> HashTable;
  9.  static HashTable instances;
  10. public:
  11.  Saveable(string key);
  12.  T getInstance(string &key);
  13. };
  14. template <class T>
  15. Saveable<T>::Saveable(string key)
  16. {
  17. instances[key] = "toto";
  18. return ;
  19. }
  20. template <class T>
  21. T Saveable<T>::getInstance(string &key)
  22. {
  23. // Fetch the corresponding value for the provided key  
  24. T instance = instances[key];
  25. return instance;
  26. }
  27. int main(void) {
  28. Saveable <string> uneListe("toto" );
  29. string key;
  30. string value;
  31. cout << "Clé: ";
  32. cin >> key;
  33. value = uneListe.getInstance(key);
  34. cout << "valeur :" << value << endl;
  35. }


Message édité par lelfe le 19-11-2004 à 18:15:56
Reply

Marsh Posté le 19-11-2004 à 18:14:51   

Reply

Marsh Posté le 19-11-2004 à 18:18:41    

avec un static fo faire une redecl dans le cpp, genre :
 

Code :
  1. class A
  2. {
  3. static int a;
  4. }


 
et dans le cpp:

Code :
  1. int A::a;


 
 
(et a l'avenir, please, dis pas "y'a une erreur", mais donne la

Reply

Marsh Posté le 19-11-2004 à 18:23:51    

template <class T>
typename Saveable<T>::HashTable Saveable<T>::instances;
 
 
par contre, ça manque gavé de 'const string&' au niveau du prototype de toutes tes fonctions membres.

Reply

Marsh Posté le 19-11-2004 à 18:30:33    

chrisbk a écrit :

avec un static fo faire une redecl  

non. On déclare dans la déclaration de classe, puis il faut une définition

Reply

Marsh Posté le 19-11-2004 à 18:31:18    

oué, bon.

Reply

Marsh Posté le 19-11-2004 à 18:40:37    

chrisbk a écrit :


(et a l'avenir, please, dis pas "y'a une erreur", mais donne la


 
Oui, c'est vrai autant pour moi. J'ai posté trop vite.
Mais bon, là, je pense pas que le problème soit très compliqué, ca doit être assez classique :).

Reply

Marsh Posté le 19-11-2004 à 19:36:51    

lelfe a écrit :

Oui, c'est vrai autant pour moi. J'ai posté trop vite.
Mais bon, là, je pense pas que le problème soit très compliqué, ca doit être assez classique :).

parce qu'en plus tu sais pas lire ?

Reply

Marsh Posté le 19-11-2004 à 19:49:08    

Taz a écrit :

parce qu'en plus tu sais pas lire ?


 
mais franchement taz, si c'est juste pour sortir de la merde comme ca, ferme la

Reply

Marsh Posté le 19-11-2004 à 19:50:48    

bah je comprends, sa réponse. T'as filé l'explication, et moi le code ad-hoc. Moi je comprends 'ça serait sympa si vous aviez la solution, je pense pas que ça doit être compliqué, c'est certainement un problème classique' ...

Reply

Marsh Posté le 19-11-2004 à 19:54:12    

moi j'ai compris ca comme "bah ca m'avait l'air classique, spourca que j'avions point filé el indicazione del linker"

Reply

Marsh Posté le 19-11-2004 à 19:54:12   

Reply

Marsh Posté le 19-11-2004 à 19:56:14    

bah il a utilisé le présent :/

Reply

Marsh Posté le 19-11-2004 à 20:32:52    

chrisbk a écrit :

moi j'ai compris ca comme "bah ca m'avait l'air classique, spourca que j'avions point filé el indicazione del linker"


 
En effet, c'était le cas :).
J'ai utilisé le présent, car je pense que ce genre d'erreur est assez classique et le sera encore. C'est une erreur que les débutants doivent faire régulièrement.
 
De plus, je comptais poster un second post car j'ai pas très bien compris comment s'utilisait le code gracieusement fourni, mais je vis ma vie aussi, et je n'ai pas pu le faire tout de suite, donc ce post a été mon unique réponse. Je trouve ca dommage que je sois obligé de me justifier comme ca.  
Donc, calmez vous les gars, y'a pas besoin de s'énerver pour ca, c'est le WE :)
 
Bon, je continue de chercher comment on utilise ca, mais c'est pas gagné :)
 
Lelfe

Reply

Marsh Posté le 19-11-2004 à 20:37:13    

c'est pas vraiment une erreur, c'est une incompréhension de la dissociation entre déclaration et définition.
 
Mais là je crois que chrisbk sera d'accord avec moi : tu cherches quoi ailleurs ? qu'est-ce que t'as pas compris ?

Reply

Sujets relatifs:

Leave a Replay

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