Membre statique, g++ et core dumped
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:
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:
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:
1 2 3 4 5
| /* EnumTest.cpp */
#include "EnumTest.hpp"
const EnumTest EnumTest::E11(11);
const EnumTest EnumTest::E12(12); |
Code:
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;
} |
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 8O
Code:
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) |
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 :)
Bonne journée à tous!