考虑这段代码:
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 类定义之前,因为 A::B 尚未声明。而且我显然不能声明“A类::B”,要声明BI类必须给出A类的定义,据我所知,“朋友”声明必须在A类的定义中。
对我来说奇怪的是,如果我将函数“bar()”从名称空间 foo 中取出,一切正常。对我来说,在命名空间内有一个函数或不在一个命名空间内会改变编译器是否接受类中的友元函数声明,这似乎违反直觉。
有没有人知道如何正确构建所有声明等以使其正常工作?