首先第一点,我们要弄清一个概念,那就是枚举类型的名字都在其父作用域空间 可见的。举个例子就一目了然了。
enum Type { General, Light, Medium, Heavy };
enum Category{ General, Pistol, MachineGun, Cannon };
由于Category中的General和Type中的General都是全局的名字,因此编译器会报错。
C++11之前的程序员为了解决这个问题,通过namespace来分割全局空间,但是,同理,在新的那个命名空间中,仍然存在着被enum成员污染的问题。
第二点,还有一个长期让程序员不舒服的问题,那就是对于枚举类型,我们通常使用的变量个数都不超过255个,也就是说用一个字节存储就足够了。但是,枚举变量却是按整形来存储的。我们多么希望可以指定存储类型,对于小于255的enum变量,要是可以指定用char来存储就好了。
当然,还有其他一些弊端,就不一一说了。之所以说以上两点,是为了引出今天的主人公——强类型枚举。
声明强类型枚举很简单,只需要在原有的enum后加上关键字class即可。
enum class Type { General, Light, Medium, Heavy };