使用声明的类或枚举

时间:2014-06-09 16:22:57

标签: c++ class enumeration using language-lawyer

N3797的3.4.3.1/1开头说:

  

如果qualified-id的嵌套名称说明符指定了一个类,那么   在查找嵌套名称说明符后指定的名称   除下列情况外,该类的范围(10.2)。

并且其中一条规则是:

  

查找using-declaration(7.3.3)中指定的名称   查找隐藏在同一范围内的类或枚举名称   (3.3.10)。

你能举例说明这条规则吗?

2 个答案:

答案 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::sA::e纳入范围,即使它们被隐藏分别是成员和普查员。

请注意, using-declaration 也会将成员和枚举器纳入范围,因此类和枚举仍然隐藏在B的范围内;这意味着要在B或其他地方使用它们,我们需要使用structenum标记。

答案 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:
 */