クラス宣言は、クラスが宣言されたスコープ内にクラス名を導入します。
囲みスコープ内にある、その名前のクラス、オブジェクト、関数、
または他の宣言はすべて隠蔽されます。
クラス名が、同じ名前を持つ関数、列挙子、またはオブジェクトと同じスコープ内で宣言される場合は、 詳述型指定子 を使用してそのクラスを参照してください。
構文 - 詳述型指定子 >>-+-+-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 が、詳述型指定子です。 上記で示したような、別の関数、列挙子、またはオブジェクトと同じ名前でクラスを宣言することは、 お勧めしません。
また、詳述型指定子をクラス型の不完全な宣言で使用して、 現行スコープ内のクラス型のための名前を予約することもできます。
関連参照