ネーム・スペースおよびフレンド

C++最初にネーム・スペース内で宣言された名前はすべて、そのネーム・スペースのメンバーです。 非ローカルのクラス内のフレンド宣言が、最初にクラスまたは関数を宣言する場合、 そのフレンド・クラスまたは関数は、最内部の囲みネーム・スペースのメンバーです。

この構成の例を以下に示します。

// 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() を呼び出そうとする試みは、コンパイラー・エラーの結果になります。 フレンド宣言は、最初に非ローカルのクラス内で行われるので、 フレンド関数は、最内部の囲みネーム・スペースのメンバーです。 このフレンド関数は、そのネーム・スペースによってのみアクセスすることができます。

関連参照

IBM Copyright 2003