C++跨命名空间声明定义规则及自定义命名空间特殊化方法咨询
问题解答
问题1
这个观点是错误的。
你观察到的「在全局命名空间定义其他命名空间声明的函数合法」,本质和全局命名空间的特殊性无关,核心是你定义函数时加了B::这个限定符,明确告诉编译器这个定义对应的是已经在B命名空间声明过的B::func。
实际上你完全可以在任意自定义命名空间里定义其他命名空间的已声明函数,比如下面的代码可以正常编译运行:
#include <iostream> namespace B{ void func(); } namespace C{ // 在自定义命名空间C中定义B的成员函数 void B::func(){ std::cout<<"abcdef\n"; } } int main(){ B::func(); }
全局命名空间唯一的特殊性仅在于:C++标准明确规定,全局命名空间的成员不能在其他命名空间内部定义,和所谓的「编译器始终检索全局空间」没有任何关系。
问题2
首先全局命名空间并没有独有的「跨命名空间定义」特权,上面的例子已经证明自定义命名空间也可以跨空间定义其他命名空间的已声明函数,只要你用正确的限定名指定函数所属的命名空间即可。
你给出的反向代码编译失败,是因为你尝试在自定义命名空间B内部定义全局命名空间的函数,这违反了C++标准对全局命名空间成员的定义约束,不是因为自定义命名空间缺少什么特殊权限。
如果要实现跨命名空间的函数定义,遵循两条规则即可:
- 函数必须先在它所属的命名空间内完成前置声明
- 定义时用完整的命名空间限定名指定函数所属的命名空间(全局命名空间的成员除外,只能在全局作用域定义)
目前没有办法让自定义命名空间获得和全局命名空间一样的、允许其他命名空间内部定义自身成员的特性,这是C++标准层面的规定。
内容的提问来源于stack exchange,提问作者Eurus_
相关产品推荐
相关产品推荐

