2017-06-05 113 views
0

我不确定B类中的两个数据成员声明是否相同。C++标准默认命名空间

//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

[合格名称查找](http://en.cppreference.com/w/cpp/language/qualified_lookup)与[不合格名称查找](HTTP://en.cppreference .COM/W/CPP /语言/ unqualified_lookup)。 – Jarod42

+0

代码是否可以编译? – Bernard

+0

所以在你的情况下它是相同的。 – Jarod42

回答

0

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

为什么?

Id(没有A::)是一个不合格的名称。 C++则诉诸于该规则找到合适的编号:

成员函数定义成员函数 体,成员函数的默认参数,成员函数的异常规范 ,默认成员内部使用的名称初始化,或嵌套 类定义(包括从该嵌套 类来源的碱基的名称),搜索的范围是相同的类中定义 ,内部[...]

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

d)如果此类 是一个命名空间的成员,或嵌套在一类是一个命名空间的成员 ,或者是在一个函数的局部类是 成员的命名空间,的范围命名空间将被搜索,直到类的定义为 ,包含类或函数。如果查找 对于由朋友声明引入的名称:在这种情况下仅包含 ,则考虑最内层的封闭名称空间,否则查找 将像往常一样继续封装名称空间,直到全局范围。

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