Вот что я понял:
#include <cstdio>
#include <string>
#include <map>
namespace Color
{
typedef enum
{
Red = 0,
Green = 1,
Blue = 2
} Color;
Color colors[] = {Red, Green, Blue}; // same order as above,
//to preserve index.
//int colors_len = sizeof(colors)/sizeof(Color);
// (if you want to check for valid values)
static inline Color OfInt(int value)
{
// if(value >= colors_len) do error thing;
return colors[value];
}
}
int main()
{
Color::Color c = Color::Red;
printf("%d,", c);
c = Color::OfInt(1);
printf("%d,", c);
c = Color::Blue;
printf("%d\n", c);
std::map<Color::Color, std::string> map;
map[Color::Red] = "red";
return 0;
}
По крайней мере, у вас есть то поведение, которое вы хотели. Вам не хватает того, что вам нужно?
Он компилируется с g ++ 4.3.3 и, кажется, работает нормально.
Я сделал объект пространства имен, чтобы перевести перечисления в другую область. (чтобы красный не забрали и т. д.) Может быть, вы можете разбить его на что-то, что вы могли бы использовать? :)
Если вы хотите, чтобы Color :: Color находился вне этого пространства имен, вы можете сделать:
typedef Color::Color ColorEnum;
Но имя Color, к сожалению, занято пространством имен.