C++ で列挙型を前方宣言する 質問する

C++ で列挙型を前方宣言する 質問する

次のようなことをやろうとしています:

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.

おすすめ記事