C ++标准默认命名空间

时间:2017-06-05 13:42:49

标签: c++ namespaces

我不确定B类中的两个数据成员声明是否相同。

//file0.h
namespace C
{
   typedef int Id;
}
//file1.h
namespace A
{
   typedef int Id;
}

//file2.h
namespace A
{
   class B
   {
      public:
      // ...
      //Want to add data member theId as:
      //Id theId;
      //or
      //A::Id theId;
   }
}

也就是说,在没有A ::的情况下,C ++标准是否存在这样的情况下使用的默认命名空间?例如,它可能默认为命名空间A,因为该类正在声明它。

如果使用Id theId,它将使用哪个命名空间,A或C?

编辑1:注释掉代码以避免混淆。 编辑2:添加另一个具有不同命名空间的“theId”以更好地说明问题。

1 个答案:

答案 0 :(得分:0)

答案是Id结果A :: Id theId。

为什么?

Id(没有A::)是一个不合格的名字。然后,C ++会使用此规则来查找正确的Id:

  

成员函数定义对于成员函数内使用的名称   body,成员函数的默认参数,异常规范   成员函数,默认成员初始值设定项或嵌套内部   类定义(包括嵌套的基数的名称)   类是派生的),搜索的范围与类中的相同   定义,[...]

     

[类定义]搜索以下范围:

     

d)如果这个班级   是名称空间的成员,或嵌套在作为成员的类中   命名空间,或者是作为其成员的函数中的本地类   一个命名空间,直到搜索命名空间的范围   类的定义,封闭类或函数。如果查找   由朋友声明引入的名称:仅在这种情况下   考虑最内层的封闭命名空间,否则查找   继续将命名空间括起来,直到全局范围为止。

参考:http://en.cppreference.com/w/cpp/language/unqualified_lookup