[解決済み] C++でenumを前方に宣言する
質問
以下のようなことをやろうとしています。
enum E;
void Foo(E e);
enum E {A, B, C};
というメッセージが表示され、コンパイラに拒否されます。 Googleで調べてみたところ、「できない」という意見が多いようですが、その理由がわかりません。 どなたか説明していただけませんか?
明確化 2: 私は、クラス内に当該列挙型を受け取るプライベート・メソッドがあり、列挙型の値を公開したくないので、この方法をとっています。
enum E {
FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}
プロジェクトXはユーザーに知られたくないものだからです。
そこで、enumをフォワード宣言して、ヘッダファイルにプライベート・メソッドを記述し、cppの内部でenumを宣言し、ビルドしたライブラリファイルとヘッダを人に配りたいと思いました。
コンパイラはGCCです。
解決方法は?
enum を前方宣言できない理由は、値を知らなければ、コンパイラが enum 変数に必要なストレージを知ることができないからです。 C++コンパイラは、指定されたすべての値を格納するのに必要なサイズに基づいて、実際の記憶領域を指定することが許されています。 もし、前方宣言しか見えないのであれば、翻訳ユニットはどのような記憶容量が選ばれたかを知ることができません。
char
または
int
といった具合に。
ISO C++規格の7.2.5項より。
は 基礎型 は、列挙型で定義されたすべての列挙子値を表すことができる積分型である。どの積分型を列挙の基礎型として使用するかは実装定義である。
int
ただし、列挙子の値がint
またはunsigned int
. もし 列挙者リスト が空であれば、あたかも列挙型に値0を持つ列挙子が1つあるかのような型になります。の値はsizeof()
を列挙型、列挙型のオブジェクト、あるいは列挙子に適用するとsizeof()
を基本型に適用する。
となっているので 呼び出し側 関数へのパラメータは、コールスタックを正しくセットアップするために、その大きさを知っている必要があります。
更新してください。
C++0Xでは、enum型を前方に宣言するための構文が提案され、受け入れられています。 この提案は次のサイトで見ることができます。 列挙型の前方宣言(rev.3)
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] JavaScriptSerializer - 列挙型を文字列としてJSONシリアライズする
-
[解決済み] Pythonで'Enum'を表現するにはどうしたらいいですか?
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】C++でネストした型/クラスの前方宣言