用带有int标识符的类替换enum - 不能编译

Ang*_*ber 0 c++

我正在开发一个项目,我们有一个像这样的标准枚举:

enum Services {
      RequestShower = 611,
      RequestBath = 617,
      RequestShave = 612,
      RequestHaircut = 618
};
Run Code Online (Sandbox Code Playgroud)

但是我的老板说最新的C++标准并不认为enum等同于int,所以建议使用类似这样的类:

class VatelPrivateService {
public:
   static const short
      RequestShower = 611,
      RequestBath = 617,
      RequestShave = 612,
      RequestHaircut = 618;

   static const char* getName(int val);
};

ostream operator<<(ostream& os, VatelPrivateService& service);
Run Code Online (Sandbox Code Playgroud)

好吧,我试着像这样实现:

const char* VatelPrivateService::getName(int id)
{
 #define CASE_NM(rq) case rq: return #rq
   switch(id)
   {
      CASE_NM(RequestShower);
      CASE_NM(RequestBath);
      CASE_NM(RequestShave);
      CASE_NM(RequestHaircut);
   }
#undef CASE_NM
   return "";
}

ostream& operator<<(ostream& os, const VatelPrivateService& service)
{
   os << VatelPrivateService::getName(service);
   return os;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

cout << "item: " << VatelPrivateService::RequestShower << endl;
Run Code Online (Sandbox Code Playgroud)

但上面的代码没有编译 - 得到:错误C2664:'VatelPrivateService :: getName':无法将参数1从'const VatelPrivateService'转换为'int'

希望你能看到我的意图.我该如何解决?

安格斯

Jam*_*lis 6

最新的C++标准并不认为枚举等同于int

规范enum没有改变:枚举器仍然可以隐式转换为其底层整数类型.

C++ 11增加了一个新概念,enum class它是一个"强类型和范围的枚举".这种新类型的枚举不允许将其枚举器隐式转换为基础整数类型(但是,您可以使用明确强制转换static_cast).

如果你想编写自己的作用域枚举,提供语义和类似的行为enum class,但可用的编译器不支持enum class,你应该阅读霍华德Hinnant(欣南特)的回答这个问题,其他的,其中他提供了一个工作示例.