クラス名のスコープ

C++クラス宣言は、クラスが宣言されたスコープ内にクラス名を導入します。 囲みスコープ内にある、その名前のクラス、オブジェクト、関数、 または他の宣言はすべて隠蔽されます。

クラス名が、同じ名前を持つ関数、列挙子、またはオブジェクトと同じスコープ内で宣言される場合は、 詳述型指定子 を使用してそのクラスを参照してください。

構文 - 詳述型指定子
 
>>-+-+-class--+--+----+--+-----------------------+--identifier----------------+-><
   | +-struct-+  '-::-'  '-nested_name_specifier-'                            |
   | +-union--+                                                               |
   | '-enum---'                                                               |
   '-typename--+----+--nested_name_specifier--+-identifier------------------+-'
               '-::-'                         '-+----------+--template_name-'
                                                '-template-'
 
 

構文 - ネストされた名前指定子
 
>>-+-class_name-----+--::--------------------------------------->
   '-namespace_name-'
 
>--+---------------------------------+-------------------------><
   +-template--nested_name_specifier-+
   '-nested_name_specifier-----------'
 
 

以下の例では、関数 A() の定義がクラス A を隠しているため、 このクラスを参照するには、詳述型指定子を使用する必要があります。

class A { };
 
void A (class A*) { };
 
int main()
{
      class A* x;
      A(x);
}

宣言 class A* x が、詳述型指定子です。 上記で示したような、別の関数、列挙子、またはオブジェクトと同じ名前でクラスを宣言することは、 お勧めしません。

また、詳述型指定子をクラス型の不完全な宣言で使用して、 現行スコープ内のクラス型のための名前を予約することもできます。

関連参照

IBM Copyright 2003