繁体   English   中英

使用声明的类或枚举

[英]Class or enumeration using declaration

N3797的3.4.3.1/1开头说:

如果qualified-id的nested-name-specifier指定一个类,则在类(10.2)的范围内查找在嵌套名称说明符之后指定的名称,但下面列出的情况除外。

其中一条规则是:

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

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

我相信这是标准提供的:

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声明引入了类和枚举名称A::sA::e ,即使它们分别被成员和枚举器隐藏。

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

在下面的代码中, B::m_s隐藏了C A::m_s 但是可以通过using A::m_s直接访问它。

要查看差异,请注释using-directive。

#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:
 */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM