「C++プログラミング言語」のセクション11.5.1で、BjarneStroustrupは次のように書いています。
メンバー宣言と同様に、フレンド宣言は名前を囲んでいるスコープに導入しません。
例えば:
class Matrix { friend class Xform; friend Matrix invert (const Matrix &); //.. }; Xform x; // error: no Xform in scope Matrix (*p) (const Matrix &) = &invert; // error: no invert() in scope
大規模なプログラムや大規模なクラスの場合、クラスがそれを囲むスコープに「静かに」名前を追加しないのは良いことです。多くの異なるコンテキストでインスタンス化できるテンプレートクラス(第13章)の場合、これは非常に重要です。
ただし、次のセクションでは、クラスが以前に定義されているか、フレンドを宣言しているクラスをすぐに囲む非クラススコープで定義されている必要があることを説明します。
私の質問は、クラスが以前に定義されているか、クラスをフレンドと宣言しているクラスをすぐに囲む非クラススコープで定義されている必要があるため、最初の例でXform
は、おそらくクラスがスコープ外になることはありません。Matrix
クラスの定義の前に定義されています。さらに、フレンドクラスを事前に定義するか、付与者のクラスの直後に定義する必要があるという制限があるため、フレンドクラスがスコープに含まれないという状況は考えられません。
第二に、このセクションでのBjarneの私の解釈は正しいですか?
- フレンドクラスの場合のみ、フレンドクラスは、囲んでいるスコープで事前に定義されているか、非クラススコープの直後に定義されている必要があります。
- 関数の場合、囲んでいるスコープで事前に宣言されている必要があります。または、タイプ=='フレンドシップ付与者の'クラスの引数を持つことによっても見つけることができますか?