【问题标题】:What Does Specifying a Class Name in a using Statement Do?在 using 语句中指定类名有什么作用?
【发布时间】:2016-06-20 13:10:43
【问题描述】:

鉴于以下情况:

namespace Foo{
class Bar{
    static const auto PRIVATE = 0;
    const int private_ = 1;
    void ptivateFunc() { cout << 2; }
public:
    static const auto PUBLIC = 3;
    const int public_ = 4;
    void publicFunc() { cout << 5; }
};
}

声明using Foo::Bar; 编译...但我不确定它为我提供了访问权限。谁能解释该声明的意义是什么,以及它可以让我访问Bar 而不是简单地做一个using namespace Bar

【问题讨论】:

标签: c++ class scope using named-scope


【解决方案1】:

来自cppreference

使用ns_name::name; (6)
(...)
6) using-declaration:使命名空间ns_name 中的符号name 可用于非限定查找,就像在与此 using-declaration 出现的相同类范围、块范围或命名空间中声明一样。

使用命名空间ns_name; (5)
5) using-directive:从 using-directive 之后的任何名称的非限定名称查找的角度来看,直到它出现的范围结束,namespace-name 中的每个名称都是可见的就好像它是在最近的封闭命名空间中声明的一样,其中包含使用指令和命名空间名称。

所以基本上你可以在命名空间Foo之外写Bar而不是Foo::Bar(但在使用声明的范围内),而命名空间Foo中的其他符号仍然需要全名。

如果您使用using namespace Foo,则可以通过本地名称访问Foo 中的所有符号,而无需显式Foo::

【讨论】:

  • 您可能希望包括这仅限于引入 using 声明的范围。
  • “就像在与此 using 声明出现的位置相同的类作用域、块作用域或命名空间中声明” - 所以它在引用中,但我也将它添加到解释中。跨度>
【解决方案2】:

它允许您在没有Foo 命名空间的情况下使用Bar

【讨论】:

  • 所以它和using namespace Foo;完全一样,但是它限制了Bar的范围暴露?
  • @JonathanMee,没错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2022-01-13
  • 1970-01-01
  • 2018-01-07
  • 2014-07-22
相关资源
最近更新 更多