次のコードを検討してください。
namespace foo {}
class A
{
class B
{
};
friend int foo::bar( B& );
};
namespace foo
{
int bar( A::B& )
{
}
}
G++ 4.4.3 は私に教えてくれます:
friendfun-innerclass.cpp:21: エラー: 'int foo::bar(A::B&)' は 'foo' 内で宣言されている必要があります
しかし、私は宣言することはできません:
namespace foo
{
int bar( A::B& );
}
A::B が宣言されていないため、クラス A の定義の前。そして、明らかに「クラス A::B」を宣言することはできません。クラス BI を宣言するには、クラス A の定義を指定する必要があり、私の知る限り、「フレンド」宣言はクラス A の定義内にある必要があります。
私にとって奇妙なのは、関数 "bar()" を名前空間 foo から取り出すと、すべて正常に動作することです。関数が名前空間内にあるか、名前空間内にないかによって、コンパイラがクラス内のフレンド関数宣言を受け入れるかどうかが変わることは、直感に反しているように思えます。
これを機能させるために、すべての宣言などを適切に構造化する方法を知っている人はいますか?