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指令不起作用.它不符合我的想法吗?或者它不是由编译器实现的?如果是后者,是否有理由呢?
using引用命名空间成员的声明只能A出现在命名空间或本地范围内。
using引用类成员的声明只能Nested出现在从Nested. 事实上,这样的using声明在语法上被认为是成员声明。它们用于调整访问资格,并且(带有typename)允许无需资格即可使用依赖于类型的库的成员。这些是特定的用例,因此成员using声明有点特殊。
嵌套类是其封闭类的成员。通常应该避免使用类封装来代替命名空间。元编程提供了一些规则的例外,但在这些情况下,您仍然不会使用using声明,至少在命名空间范围内,因为命名空间无法模板化。从空的元编程类继承是可行的,但请注意意大利面。
该using指令是一个不同的野兽。它看起来像是using namespace将一个名称空间链接到另一个名称空间,作为名称查找中的后备路径。