English 中文(简体)
是否使用名称空间原因名称隐藏?
原标题:Does using namespace cause name hiding?

考虑以下代码:

namespace C {
    class X {};
}

namespace A {
    class X {};

    namespace B {
        using namespace C;

        X x;
    }
}

我当时期望,由于使用命名空间 < /代码> 指令的 < 代码>, < 代码> 类型为 < 代码> C:X < / 代码 >,但由于 < 代码 > 使用命名空间 < /代码 > 指令,因此 < em> VS2010 < /em > 和在线 LLLVM/Clang 汇编者分辨率 < 代码> < 代码> X < /代码 > 在命名空间 < 代码> B/代码 > 中的类型为 < 代码> A:X < /code > 。 使用声明修改使用指令( < 代码 > 使用 C:X < /code > ),然后按照预期,确定 < 代码> C:X < /code > 。

使用指令的标准[7.3.4.2]:

使用指令指定名称空间的名称可以用于使用指令之后使用指令的范围。在不附带条件的名称查询(3.4.1)中,名称似乎是在含有使用指令和指定名称空间的最近附件名称空间中申报的,该名称空间既包含使用指令,也包含指定的命名空间。

我读到的是, C::X 应该像在名称空间 B 中宣布的那样出现,有效地隐藏了 A:X 。使用指令和使用声明之间这种不一致之处背后是标准中的哪个部分?是否有办法通过使用指令从外部范围隐藏一个名字?

最佳回答

使用指令 < / em > 的章节似乎 < em> somehow 清楚显示您看到了预期的行为 :

7.3.4p2 A 使用指令规定,提名命名空间中的名称可以用于使用指令之后使用指令时所出现的范围。在不附带条件的名称查询(3.4.1)中,这些名称似乎是在最近的附加名称空间中宣布的,该空间既包含使用指令,也包含 < 坚固 > ,也包含指定的命名空间。

7.3.4p3 " 使用指令 " 并不在声明区域中增加任何成员。

也就是说, useing-directive 将命名空间的成员添加到该指令的共同命名空间祖先和使用命名空间的搜索组中,而不是直接添加到使用 useing-directive 的范围中,在第二段引文中明确指出了这一点:它不会将任何成员添加到 useing-directive 的宣示区中。

后来有一个例子旨在说明其他事情,但实际上表明这一点:

7.3.4p4 [.]另一个例子

namespace A {
  int i;
}
namespace B {
  int i;
  int j;
  namespace C {
    namespace D {
      using namespace A;
      int j;
      int k;
      int a = i; // B::i hides A::i
    }

最后一个例子用来澄清过境性(并包含更多的代码),但实际上,它相当于您删除额外代码后的代码。

因此,在你的情况中,“使用-指令性 < /em > ”似乎不是躲藏,而是躲藏起来。

问题回答

暂无回答




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签