"使用typename"指令是否未由编译器实现?

Ete*_*nal 7 c++ using nested-class typename

我有一些看起来像这样的代码:

namespace myLibrary
{
    class A
    {
    public:
        struct Nested
        {
            ...
        };

        ...
    };
}
Run Code Online (Sandbox Code Playgroud)

在代码的其他部分,我需要访问A.因为我喜欢可读的代码,我也喜欢using指令:

using myLibrary::A;
...
A a;
Run Code Online (Sandbox Code Playgroud)

现在,在某些时候我还需要访问我的嵌套类,所以我想写这样的东西:

using myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)

显然,编译器不能知道这是一个嵌套类而不是类成员,并给我一个错误:

error : using declaration can not refer to class member
Run Code Online (Sandbox Code Playgroud)

我无法理解的是为什么这不能解决问题:

using typename myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)

编译器仍然给我完全相同的错误!

幸运的是,我有其他选择:

// Using a typedef
typedef myLibrary::A::Nested Nested;

// Using the new C++11 syntax for type aliasing
using Nested = myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)

但我想了解为什么使用typename指令不起作用.它不符合我的想法吗?或者它不是由编译器实现的?如果是后者,是否有理由呢?

Pot*_*ter 3

using引用命名空间成员的声明只能A出现在命名空间或本地范围内。

using引用类成员的声明只能Nested出现在从Nested. 事实上,这样的using声明在语法上被认为是成员声明。它们用于调整访问资格,并且(带有typename)允许无需资格即可使用依赖于类型的库的成员。这些是特定的用例,因此成员using声明有点特殊。

嵌套类是其封闭类的成员。通常应该避免使用类封装来代替命名空间。元编程提供了一些规则的例外,但在这些情况下,您仍然不会使用using声明,至少在命名空间范围内,因为命名空间无法模板化。从空的元编程类继承是可行的,但请注意意大利面。

该using指令是一个不同的野兽。它看起来像是using namespace将一个名称空间链接到另一个名称空间,作为名称查找中的后备路径。