Bonjour à tous,
je suis en train d'essayer de mettre en place une classe d'énumération comme expliquée dans "When enum just isn't enough" et je pense avoir un problème avec l'initialisation d'un membre statique dans une classe template (m_instances dans Enum<T>).
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 /* Enum.hpp */ #ifndef ENUM_HPP #define ENUM_HPP #include <set> template<typename T> class Enum { protected: explicit Enum(int value) : m_value(value) { m_instances.insert(this); } public: typedef std::set<const Enum<T> *> instances_set; int GetValue() const { return m_value; } private: int m_value; static instances_set m_instances; }; template<typename T> typename Enum<T>::instances_set Enum<T>::m_instances; #endif
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 /* EnumTest.hpp */ #ifndef ENUMTEST_HPP #define ENUMTEST_HPP #include "Enum.hpp" class EnumTest : public Enum<EnumTest> { private: explicit EnumTest(int value) : Enum<EnumTest>(value) {} public: static const EnumTest E11; static const EnumTest E12; }; #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /* EnumTest.cpp */ #include "EnumTest.hpp" const EnumTest EnumTest::E11(11); const EnumTest EnumTest::E12(12);J'en viens maintenant au problème en lui-même: pour fonctionner, ce bout de code dépend étrangement de l'ordre des fichiers passés au compilateur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /* main.cpp */ #include "EnumTest.hpp" #include <iostream> int main() { EnumTest e(EnumTest::E11); std::cout << "Value of E11 : " << e.GetValue() << std::endl; e = EnumTest::E12; std::cout << "Value of E12 : " << e.GetValue() << std::endl; return 0; }
Bien entendu, je n'aime pas beaucoup que le bon fonctionnement du code dépende de l'ordre de compilation. Si quelqu'un pouvait m'aider à démêler ce problème, je lui en serais reconnaissant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ g++ main.cpp EnumTest.cpp $ ./a.out Value of E11 : 11 Value of E12 : 12 $ g++ EnumTest.cpp main.cpp $ ./a.out Erreur de segmentation (core dumped)
Bonne journée à tous!
Partager