考虑命名空间内的一个类。类的定义声明了一个友元函数。
namespace Foo
{
class Bar
{
friend void baz();
};
}
根据我所知道的,这应该声明baz()
为最里面的封闭命名空间的成员,即Foo
.
因此,我希望以下定义baz()
是正确的:
void Foo::baz() { }
但是,GCC (4.7) 给了我一个错误。
error: ‘void Foo::baz()’ should have been declared inside ‘Foo’
几种解决方案似乎有效:
baz()
在课外声明。namespace Foo { void baz(); class Bar { friend void baz(); }; }
在命名空间内定义
baz()
。namespace Foo { class Bar { friend void baz(); }; } ... namespace Foo { void baz() { } }
使用标志进行编译
-ffriend-injection
,从而消除错误。
这些解决方案似乎与我所知道的 C++ 中声明/定义的一般规则不一致。
为什么要申报baz()
两次?
为什么定义仅在命名空间内是合法的,而在范围解析运算符中是非法的?
为什么标志消除了错误?