ネストされた型
メンバーのスコープ:インデックス への移動
クラス内で宣言されたタグ名または typedef 名は,言語定義上はそのクラスのスコープに属します。このクラスのスコープの外側からこの名前にアクセスするには,通常 xxx::yyy 表記を使います。
あるクラス内で宣言した別のクラスはネストされたクラスと呼ばれます。ネストされたクラスの名前は,それを囲っているクラスに対してローカルであり,そのスコープに属します。このようなネストは構文上のものなので,ネストしているクラスのメンバーに対して,ネストされているクラスが優先的にアクセスできるわけではありません。また,逆にメンバーからネストされたクラスに優先的にアクセスすることもできません。
クラスは,メモリ容量の許す限り任意の水準にネストできます。ネストされたクラスはいずれかのクラス内で宣言しておいて,後で定義できます。次に例を示します。
struct outer
{
typedef int t; // outer::t は typedef 名
struct inner // outer::inner はクラス
{
static int x;
};
static int x;
int f();
class deep; // ネストされた宣言
};
int outer::x; // 静的データメンバーを定義する
int outer::f() {
t x; // t はここで直接参照できる
return x;
}
int outer::inner::x; // 静的データメンバーを定義する
outer::t x; // ここでは outer::t としなければ使えない
class outer::deep { }; // ここでネストしたクラスを定義する
C++ 2.0 では,クラス内で宣言されたタグ名または typedef 名は,実際にはグローバル(ファイル)スコープに属します。次に例を示します。
struct foo
{
enum bar { x }; // 2.0 の規則: bar はファイルスコープに属する
// 2.1 の規則: bar は foo のスコープに属する
};
bar x;
上のプログラム例は C++ 2.1 では規則違反です。コンパイルしてもエラーにはなりませんが,次の警告が出ます。
Warning: Use qualified name to access nested type 'foo::bar'(警告: ネストされた型 'foo::bar' へのアクセスには限定名が必要)