C では enum が定義されているブロックの外部から enum 値にアクセスできるのに、C++ ではアクセスできないのはなぜですか?
次の C プログラムを考えてみましょう。
#include <stdio.h>
struct mystruct
{
enum {INT, FLOAT, STRING} type;
int integer;
float floating_point;
} tu;
/* Why is INT accessible here? */
int main()
{
tu.type = INT;
tu.integer = 100;
return 0;
}
C でコンパイルして正常に実行できます。
しかし、C++ ではコンパイルに失敗します。
#include <iostream>
struct mystruct
{
enum {INT, FLOAT, STRING} type;
int integer;
float floating_point;
} tu;
/* Why is INT accessible here? */
int main()
{
tu.type = INT;
tu.integer = 100;
return 0;
}
[エラー] 'INT' はこのスコープでは宣言されていません
C と C++ では列挙型とスコープのルールは異なりますか?
ベストアンサー1
C では、列挙型と構造体のスコープに関するルールはまったくありません。列挙型を定義する場所は重要ではありません。
C++ では、何かの中に別の何かを定義し (クラス内の列挙型など)、その何かを別の何かに属させます。
C++ で enum をグローバルにしたい場合は、クラスの外部で定義するか、構造体パスからアクセスする必要があります。
#include <iostream>
struct mystruct
{
enum {INT, FLOAT, STRING} type;
int integer;
float floating_point;
} tu;
int main()
{
tu.type = mystruct::INT; // INT is not in global scope, I have to precise it.
tu.integer = 100;
return 0;
}
注記:struct
この例では、すべてがデフォルトでを使用しているため、これが機能public
します。注意が必要です。列挙型がスコープ内にある場合にのみ、構造体またはクラスの外部から列挙型と値にアクセスできます (public
任意のフィールドまたは関数として)。