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

时间:2017-02-20 11:18:19

标签: c++ class struct namespaces symbols

我正在测试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. 姓名&#34; S&#34;类名和命名空间之间的重复不会发生冲突吗?
  2. 如果两者都有名字&#34; S&#34;,似乎&#34; struct S&#34;具有更高的优先级
  3. 如果我评论#include&#34; testns01.h&#34;的行,程序将打印2,仍然可以。所以我的第三个问题是:

    1. 关于名称查找是如何解决重复名称重复问题的c ++标准吗?
    2. 谢谢!

1 个答案:

答案 0 :(得分:2)

  
      
  1. 名称“S”在类名和命名空间之间重复不冲突吗?
  2.   

他们这样做。

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

没有。 (见下文)

  
      
  1. 关于名称查找是如何解决重复名称重复问题的c ++标准吗?
  2.   

是。引用N4140的相关部分:

  

§3.3.1[basic.scope.declarative] / 4

     

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

     
      
  • 他们都应该引用同一个实体,或者全部引用功能和功能模板;或
  •   
  • 正好一个声明应声明一个不是typedef名称的类名或枚举名,其他声明应全部   引用相同的变量或枚举,或全部引用函数   和功能模板;在这种情况下,类名或枚举   名称是隐藏的。 [注意: 命名空间名称或类模板名称   必须在其声明区域中是唯一的。 - 结束记录]
  •   

我认为你不小心让你的榜样为你工作,因为你重复了包含警卫。我能够从问题:

重现课程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