最初にネーム・スペース内で宣言された名前はすべて、そのネーム・スペースのメンバーです。
非ローカルのクラス内のフレンド宣言が、最初にクラスまたは関数を宣言する場合、
そのフレンド・クラスまたは関数は、最内部の囲みネーム・スペースのメンバーです。
この構成の例を以下に示します。
// f has not yet been defined void z(int); namespace A { class X { friend void f(X); // A::f is a friend }; // A::f is not visible here X x; void f(X) { /* definition */} // f() is defined and known to be a friend } using A::x; void z() { A::f(x); // OK A::X::f(x); // error: f is not a member of A::X }
この例では、関数 f() は、呼び出し A::f(s); を使用して、 ネーム・スペース A によってのみ、呼び出すことができます。 A::X::f(x); 呼び出しを使用して class X によって、 関数 f() を呼び出そうとする試みは、コンパイラー・エラーの結果になります。 フレンド宣言は、最初に非ローカルのクラス内で行われるので、 フレンド関数は、最内部の囲みネーム・スペースのメンバーです。 このフレンド関数は、そのネーム・スペースによってのみアクセスすることができます。
関連参照