Bonjour à tous,
ayant pris conscience que j'avais quelques lacunes concernant le mot clé static, j'ai voulu tenter quelque chose:
Je voudrais avoir une classe qui m'encapsule une map. Cette map sera statique et sera initialisée une fois. Cette map fera le lien entre un type de terrain et un string correspondant au path d'un fichier. Ainsi, n'importe où dans mon application, je pourrais récupérer le chemin du fichier en fonction du type de terrain.
Voici le code:
Et j'obtiens tout un tas d'erreur de lien que je ne comprend pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 // ------------------------------ enum GroundType { GRASS, MUD, }; // ------------------------------ class GroundTypeMap { public: GroundTypeMap(){} ~GroundTypeMap(){} static void init() { m_map[GroundType::GRASS] = "c:\\temp\\grass.bmp"; m_map[GroundType::MUD] = "c:\\temp\\mud.bmp"; } private: static std::map<int, std::string> m_map; }; // ------------------------------ class Manager { public: Manager(){GroundTypeMap::init();} ~Manager(); };
ou encore:Erreur 1 error LNK2019:
symbole externe non résolu "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::operator= (char const *)" (__imp_??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) référencé dans la fonction "public: static void __cdecl GroundTypeMap::init(void)" (?init@GroundTypeMap@@SAXXZ) R_PNGManager.objJ'ai remarqué également que si je supprime l'appel à GroundTypeMap::init(); la compilation réussit, même si je laisse la définition de cette méthode init.Erreur 2 error LNK2001: symbole externe non résolu "private: static class std::map<int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<int>,class std::allocator<struct std::pair<int const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > GroundTypeMap::m_map" (?m_map@GroundTypeMap@@0V?$map@HV?$basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@@std@@U?$less@H@2@V?$allocator@U?$pair@$$CBHV?$basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@ @std@@@std@@@2@@std@@A) R_PNGManager.obj
Est-ce que vous avez une idée de ce qu'il se passe ici?
ps: je sais, il faudra que je rajoute un mécanisme pour s'assurer que la classe ne soit initialisée qu'une fois, et surtout, qu'on ne puisse pas l'utiliser si elle n'est pas initialisée.
Partager