次のようなことをやろうとしています:
enum E;
void Foo(E e);
enum E {A, B, C};
コンパイラが拒否します。Google でざっと調べてみたところ、「それはできない」というのがコンセンサスのようです。なぜでしょうか?
説明2: クラスに列挙型を取るプライベートメソッドがあり、列挙型の値を公開したくないので、これを行っています。たとえば、Eが次のように定義されていることを誰にも知られたくないのです。
enum E {
FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}
プロジェクト X はユーザーに知られたくないものだからです。
そこで、列挙型を前方宣言して、プライベート メソッドをヘッダー ファイルに配置し、列挙型を cpp 内で内部的に宣言し、ビルドされたライブラリ ファイルとヘッダーをユーザーに配布できるようにしたいと考えました。
コンパイラはGCCです。
ベストアンサー1
C++11 以降では、列挙型の前方宣言が可能です。以前は、列挙型を前方宣言できなかったのは、列挙のサイズがその内容に依存していたためです。列挙のサイズがアプリケーションによって指定されている限り、前方宣言できます。
enum Enum1; // Illegal in C++03 and C++11; no size is explicitly specified.
enum Enum2 : unsigned int; // Legal in C++11.
enum class Enum3; // Legal in C++11, because enum class declarations have a default type of "int".
enum class Enum4: unsigned int; // Legal C++11.
enum Enum2 : unsigned short; // Illegal in C++11, because Enum2 was previously declared with a different type.