G
(グローバルネームスペース内)とC
(ネームスペースA
)のクラスに友人になるクラスF
があるとします。C++フレンドクラスは他のネームスペースでのみ前方宣言を必要とするのはなぜですか?
A::C
に友人になるためには、F
を前方宣言する必要があります。G
の友人になるためには、F
というフォワード宣言は必要ありません。- 同様に、クラス
A::BF
は前方宣言せずに
A::C
に友人もでき、次のコードは、このことを示しており、GCC 4.5、VC++ 10と少なくとも一つの他のコンパイラでコンパイルして。
class G {
friend class F;
int g;
};
// without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} // namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
これは私には矛盾しているようです。これには理由がありますか、それとも単に標準の設計上の決定ですか?
+1。それは書くために十分ではない理由を –
合理的な人は、「F :: 'フレンドクラス;'」頼むかもしれない(OPのコードに示すように)、これを明示的グローバル名前空間に 'F'を押します。答えは「修飾IDは決して新しい名前を宣言しません」という行に沿っていると思いますが、この点について標準が何を言っているのか正確には分かりません。それ@Zack – zwol
は、あまりにも、私の最初の質問だった:なぜ私は別の名前空間内のクラスを移動すると、前方宣言を追加する必要がありますか?しかし、このトピックについて既にいくつかの議論があります(例:http://stackoverflow.com/questions/2059665/、http://stackoverflow.com/questions/1368642/)。同じ範囲で前方宣言を必要としないことは、標準の作成者によって認められた利便性であると思われる。 – pesche