C++命名空间名和类名重复会导致冲突吗?

Posted

技术标签:

【中文标题】C++命名空间名和类名重复会导致冲突吗?【英文标题】:Does C++ namespace name and class name duplication lead to conflict? 【发布时间】: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++ 标准是否讨论名称查找如何解决重复名称重复问题?

【问题讨论】:

相关:***.com/questions/4070915/… @Barmar 不同之处在于,在您指出的链接中,结构/类和名称空间的相同名称未在同一(全局)命名空间中定义。我很惊讶编译器甚至没有发出警告。 编译器版本?我无法在 g++-4.6、g++-6.1 上重现它。 GCC 6.3.0: error: 'struct S' redeclared as different kind of symbol. previous declaration 'namespace S ' "如果我编译并运行,我得到:" ...你得到了什么? 【参考方案1】:
    类名和命名空间之间的名称“S”重复不冲突?

确实如此。

    当两者都具有名称“S”时,似乎“struct S”具有更高的优先级

它没有。 (往下看)

    c++ 标准是否谈到名称查找如何解决重复名称重复?

是的。引用N4140的相关部分:

§3.3.1 [basic.scope.declarative] / 4

给定单个声明区域中的一组声明,每个 它指定了相同的非限定名称,

应该都指同一个实体,或者都指函数和函数模板;或 恰好一个声明应声明一个不是 typedef 名称的类名或枚举名,而其他声明应全部 引用相同的变量或枚举器,或全部引用函数 和功能模板;在这种情况下,类名或枚举 名字被隐藏了。 [ 注意: 命名空间名称或类模板名称 在其声明区域中必须是唯一的。 —尾注 ]​​i>

我认为您不小心让您的示例为您工作,因为您重复了包含守卫。我能够从问题中重现 S 类的“偏好”:

#ifndef FOO
#define FOO
struct S
    static int f()return 1;
;
#endif

#ifndef FOO
#define FOO
namespace S
    static int f()return 2;

#endif

#include<stdio.h>
int main()

    int i = S::f();
    printf("%d\n",i);
    return 0;

link

【讨论】:

谢谢,发现是低版本gcc的bug,高版本的gcc报这个bug。 啊,所以我的猜测不正确。不过,它一定是一个非常旧的 gcc 版本。 wandbox 上的 4.4.7 仍然在这方面出错。

以上是关于C++命名空间名和类名重复会导致冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++命名空间与缺省参数

C++命名空间与缺省参数

C++ 唯一类名与命名空间

类名可以用作命名空间吗?

C++命名空间

C++命名空间