J'ai récupéré sur le net (http://www.ddj.com/dept/cpp/184403955) un exemple de gestion des enum au travers d'une classe template qui fonctionnait correctement sous Linux moyennant quelques modifications mineures. Malheureusement, en passant au compilateur gcc version 3.4.5 20051201, après une correction de l'initialisation du membre statique pour que le code compile, le programme plante à l'exécution (segmentation fault).
Merci d'avance pour votre aide.

Le code:
La classe (extrait):
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
 
#include <set>
template <class T>
class Enum {
private:
...
  // Comparison functor for the set of instances
  struct Enum_Ptr_Less:
   public std::binary_function<const Enum<T>*, const Enum<T>*, bool> {
      bool operator()(const Enum<T>* E_1, const Enum<T>* E_2)
      { return E_1->Get_Value() < E_2->Get_Value(); }
  };
protected:
  // Constructors
  Enum(int Value): m_value(Value) {
  s_instances.insert(this);
  };
public:
  // Compiler-generated copy constructor and operator= are OK.
  typedef typename std::set<const Enum<T>*, Enum_Ptr_Less> instances_list;
  typedef typename instances_list::const_iterator const_iterator;
...
private:
  int m_value;
  static instances_list s_instances;
};
Le main:
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
 
#include "Enum.h"
typedef enum _e_MODE {
        MODE_OFF = 0,
        MODE_ON = 1
} MODE;
 
class MODE_Enum: public Enum<MODE_Enum> {
 
private:
 explicit MODE_Enum(int Value): Enum<MODE_Enum>(Value) { }
 
public:
  static const MODE_Enum mode_on;
  static const MODE_Enum mode_off;
};
 
template <class T> typename Enum<T>::instances_list Enum<T>::s_instances;
/* Code avec l'ancienne version du compiltaeur
Enum<SONAR_MODE_Enum>::instances_list Enum<SONAR_MODE_Enum>::s_instances;
qui provoque l'erreur:
error: too few template-parameter-lists
*/
const MODE_Enum MODE_Enum::mode_off(MODE_OFF);
const MODE_Enum MODE_Enum::mode_on(MODE_ON);
int main(int argc, char* argv[])
{
}