语言律师,注意!
我有以下代码:
namespace conflicting
{
struct Foo {};
}
namespace outer
{
namespace conflicting
{
struct Bar {};
}
}
using namespace outer;
int main()
{
conflicting::Bar b;
return 0;
} 使用g++ 4.8.2,在试图编译时会出现以下错误:
t.cpp: In function ‘int main()’:
t.cpp:18:5: error: reference to ‘conflicting’ is ambiguous
conflicting::Bar b;
^
t.cpp:2:1: note: candidates are: namespace conflicting { }
{
^
t.cpp:9:5: note: namespace outer::conflicting { }
{
^
t.cpp:18:5: error: reference to ‘conflicting’ is ambiguous
conflicting::Bar b;
^
t.cpp:2:1: note: candidates are: namespace conflicting { }
{
^
t.cpp:9:5: note: namespace outer::conflicting { }
{
^
t.cpp:18:22: error: expected ‘;’ before ‘b’
conflicting::Bar b;有人能向我解释一下为什么会发生这个错误吗(也许可以参考标准的一个部分)?
发布于 2016-02-19 17:41:10
快速总结:对于X::m是一个限定-id,X需要唯一地引用单个名称空间。
conflicting::Bar是一个限定id,如果conflicting是“一个命名空间的嵌套名称说明符”,而Bar是“该名称空间的一个成员的名称(或者使用-指令可以看到的名称空间成员的名称)”(所有引用都是对N3337的引用,所有的强调都是我的):
5.1.1一般expr.prim.general
第3.4节描述了名称查找的过程,它要求名称查找为名称找到一个明确的声明(重载函数是例外):
3.4Name查找basic.lookup
第3.4.3.2节的措辞明确指出名称空间必须是唯一的:
3.4.3.2名称空间成员namespace.qual
这种描述假定X是唯一的,因为它没有描述迭代一组可能的名称空间来查找m的任何过程。
由于编译器无法确定要使用哪个conflicting命名空间作为命名空间成员查找的起点,因此会给出一个错误。
希望这能有所帮助。
发布于 2016-02-19 17:35:51
您用conflicting::限定了一个名称,所以编译器需要在该范围内查找Bar .但是哪个范围呢?它可以引用两种不同的方法,即::conflicting或outer::conflicting,因为使用-指令可以不用outer::前缀来引用它们。
发布于 2016-02-19 17:34:52
哟,这不需要语言律师!一旦将outer命名空间引入当前的名称空间(通过using ),它的所有名称都变得可见。所以现在你们有冲突了。
这就是为什么我强烈地讨论using (命名空间)的实践。名称空间的出现是有原因的,其原因是为了防止此类问题的发生。
https://stackoverflow.com/questions/35511323
复制相似问题