namespace X { int i = 1; }namespace Q { namespace P { int i = 2; using namespace X; } using namespace P; int l = i;}int main() {}
如果我们像这样修改它,我们会得到一个名称查找模糊:
namespace X { int i = 1; }namespace P { int i = 2; using namespace X;}using namespace P;int l = i;int main() {}
我在这里做的唯一更改是删除命名空间Q并将其内容放在全局命名空间中.
我试过3个不同的编译器:
> GCC和Clang与http://melpon.org/wandbox
>视觉c与http://webcompiler.cloudapp.net/
所有这些都给出了这封电子邮件中的结果,我试图找出原因.
任何人都可以用c标准来解释这种行为吗?我不明白.
解决方法 在第一个程序中使用的变量i是在命名空间P中定义的,因为using指令using namespace X;
在全局命名空间中放置X的声明(X和P的通用名称).因此,在P中的i声明(更准确地说,由于另一个using指令在Q中)声明了X :: i在全局命名空间中的声明.
来自C标准(3.4.1非限定名称查找)
2 The declarations from the namespace nominated by a using-directive
become visible in a namespace enclosing the using-directive; see
7.3.4.
所以我们有第一个项目
namespace X { int i = 1; }namespace Q { namespace P { int i = 2; using namespace X; // 1 } using namespace P; // 2 int l = i;}
使用指令#1的封闭命名空间是全局命名空间,使用指令#2的封闭命名空间是namepsace Q.
在第二个程序中,由于这两个using指令,i的两个定义都放在了全局命名空间中
//...using namespace X;//...using namespace P;总结
以上是内存溢出为你收集整理的c – 名称查找歧义不一致全部内容,希望文章能够帮你解决c – 名称查找歧义不一致所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)