N3797的3.4.3.1/1开头说:
如果qualified-id的嵌套名称说明符指定了一个类,那么 在查找嵌套名称说明符后指定的名称 除下列情况外,该类的范围(10.2)。
并且其中一条规则是:
查找using-declaration(7.3.3)中指定的名称 查找隐藏在同一范围内的类或枚举名称 (3.3.10)。
你能举例说明这条规则吗?
答案 0 :(得分:0)
我相信这是标准提供的内容:
struct A {
struct s {} s;
enum e { e };
};
struct B: A {
using A::s;
using A::e;
};
struct B::s s2;
enum B::e e2;
B
范围内的 using-declaration 将类和枚举名称A::s
和A::e
纳入范围,即使它们被隐藏分别是成员和普查员。
请注意, using-declaration 也会将成员和枚举器纳入范围,因此类和枚举仍然隐藏在B
的范围内;这意味着要在B
或其他地方使用它们,我们需要使用struct
和enum
标记。
答案 1 :(得分:0)
在以下代码B::m_s
中隐藏A::m_s
中的C
。但可以通过using A::m_s
直接访问它。
要查看使用指令中的差异注释。
#include <iostream>
#include <string>
struct A {
std::string m_s;
A() :
m_s("I am A::m_s")
{}
};
struct B: A {
std::string m_s;
B() :
m_s("I am B::m_s")
{}
};
struct C: B {
using A::m_s;
};
int main() {
C c;
std::cout << '\n' << c.C::m_s << '\n';
}
/*
Local Variables:
compile-command: "g++ -g test.cc -o a.exe && ./a.exe"
End:
*/