【发布时间】:2017-07-09 15:34:58
【问题描述】:
我正在测试 C++ 的名称查找规则。我有一个包含 3 个文件的简单程序:
$cat testns01.h
struct S{
static int f(){return 1;}
};
$cat testns02.h
namespace S{
static int f(){return 2;}
}
$cat testns3.cpp
#include "testns02.h" // namespace
#include "testns01.h" // struct
#include<stdio.h>
int main()
{
int i = S::f();
printf("%d\n",i);
return 0;
}
如果我编译并运行,我会得到:
$g++ testns3.cpp && ./a.out
1
好的,我有 3 个问题:
- 类名和命名空间之间的名称“S”重复不冲突?
- 当两者都具有名称“S”时,似乎“struct S”具有更高的优先级
如果我注释#include "testns01.h" 行,程序会打印2,仍然可以。所以我的第三个问题是:
- c++ 标准是否讨论名称查找如何解决重复名称重复问题?
【问题讨论】:
-
@Barmar 不同之处在于,在您指出的链接中,结构/类和名称空间的相同名称未在同一(全局)命名空间中定义。我很惊讶编译器甚至没有发出警告。
-
编译器版本?我无法在 g++-4.6、g++-6.1 上重现它。
-
GCC 6.3.0:
error: 'struct S' redeclared as different kind of symbol. previous declaration 'namespace S { }' -
"如果我编译并运行,我得到:" ...你得到了什么?
标签: c++ class struct namespaces symbols