我不确定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”以更好地说明问题。
答案 0 :(得分:0)
答案是Id结果A :: Id theId。
为什么?
Id(没有A::)是一个不合格的名字。然后,C ++会使用此规则来查找正确的Id:
成员函数定义对于成员函数内使用的名称 body,成员函数的默认参数,异常规范 成员函数,默认成员初始值设定项或嵌套内部 类定义(包括嵌套的基数的名称) 类是派生的),搜索的范围与类中的相同 定义,[...]
[类定义]搜索以下范围:
d)如果这个班级 是名称空间的成员,或嵌套在作为成员的类中 命名空间,或者是作为其成员的函数中的本地类 一个命名空间,直到搜索命名空间的范围 类的定义,封闭类或函数。如果查找 由朋友声明引入的名称:仅在这种情况下 考虑最内层的封闭命名空间,否则查找 继续将命名空间括起来,直到全局范围为止。
参考:http://en.cppreference.com/w/cpp/language/unqualified_lookup