问题描述
AFAIK a using directive
将命名空间中的所有名称注入最近的封闭命名空间范围。这是一个我不明白其中区别的示例:
namespace Exercise {
int ivar = 0;
double dvar = 0;
const int limit = 1000;
}
// using namespace Exercise;
void manip() {
using namespace Exercise;
++ivar;
++::ivar;
}
考虑命名空间 Exercise
和函数 manip
是在全局命名空间范围内定义的。在我看来,函数体内的 using 指令将命名空间 Exercise
中的所有三个成员名称注入全局作用域,并且正好在函数 manip
的定义之前,所以就好像它是这样的:
int ivar = 0; // injected here
double dvar = 0; // injected here
const int limit = 1000; // injected here
// using namespace Exercise;
void manip() {
using namespace Exercise;
++ivar; // ok using Exercise::ivar
++::ivar; // error? 'error: ‘::ivar’ has not been declared; did you mean ‘Exercise::ivar’?
-
那么为什么
++::ivar
编译失败,只要该名称已经注入全局命名空间? -
对我来说重要的是:如果我取消注释函数
manip
主体之外的第一个 using 指令,那么代码编译得很好,编译器不会抱怨这样的表达式:++::ivar
?
那么这两个 using directives
有什么区别?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)