C++标准缺省命名空间

C++标准缺省命名空间,c++,namespaces,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

我不确定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++标准是否使用默认命名空间?e、 例如,它可能默认为命名空间A,因为类正在其中声明

如果使用Id theId,它将使用哪个名称空间,A还是C

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

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

为什么?

没有A::的Id是非限定名称。然后C++使用这个规则找到正确的ID:< /P> 成员函数中使用的名称的成员函数定义 主体,成员函数的默认参数,异常规范 成员函数、默认成员初始值设定项或嵌套 类定义,包括从中嵌套 类,则搜索的范围与类中的范围相同 定义,[……]

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

d如果这节课 是命名空间的成员,或嵌套在作为成员的类中 名称空间的,或者是作为的成员的函数中的本地类 在命名空间中,将搜索命名空间的范围,直到 类、封闭类或函数的定义。如果查找 对于朋友声明引入的名称:仅在本例中 将考虑最内部的封闭命名空间,否则为查找 继续封闭名称空间,直到像往常一样进入全局范围


参考:

vs.代码是否编译?因此,在您的情况下,它是相同的。标准是否定义了默认名称空间?不,不是真的。它使用当前名称空间,在本例中为A。