【问题标题】:Does C++ namespace name and class name duplication lead to conflict?C++命名空间名和类名重复会导致冲突吗?
【发布时间】: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 个问题:

  1. 类名和命名空间之间的名称“S”重复不冲突?
  2. 当两者都具有名称“S”时,似乎“struct S”具有更高的优先级

如果我注释#include "testns01.h" 行,程序会打印2,仍然可以。所以我的第三个问题是:

  1. 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


【解决方案1】:
  1. 类名和命名空间之间的名称“S”重复不冲突?

确实如此。

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

它没有。 (往下看)

  1. 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 仍然在这方面出错。
猜你喜欢
  • 2014-07-01
  • 2021-11-22
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多