C++で重複した列挙型名の定義

CやレガシC++ではEnum名の重複は許されていませんが、C++11で導入されたスコープあり (Scoped) Enum型では名前の重複が可能です


例として以下のコードはコンパイルエラーになります (C++11以降でも)

enum Car { red = 1, green = 2, blue = 3 };
enum Bike { red = 1, green = 2, blue = 3 };  // Error! 重複

スコープありEnumとしたい場合はclassまたはstructenumの後に付加します (ここではclass/structは同じ意味)

enum class NewCar { red = 5, green = 6, blue = 7 };
enum class Bike { red = 8, green = 9, blue = 10 }; // OK! : 重複も可能

スコープなしEnumの名前は省略可能ですが、スコープありの場合は参照時に必要となるため必須です。参照は<Enum名>::<要素名>の形です

constexpr const char* NewCar2Str(NewCar val) {
  switch (val) {
    case NewCar::red:
      return "red";
    case NewCar::green:
      return "green";
    case NewCar::blue:
      return "blue";
  }
  return "unknown";
}

おすすめ