【发布时间】:2014-05-24 17:22:00
【问题描述】:
我有一些看起来像这样的代码:
namespace myLibrary
{
class A
{
public:
struct Nested
{
...
};
...
};
}
在代码的其他部分,我需要访问A。由于我喜欢可读的代码,所以我也喜欢using指令:
using myLibrary::A;
...
A a;
现在,在某些时候我还需要访问我的嵌套类,所以我想写这样的东西:
using myLibrary::A::Nested;
显然,编译器无法知道这是一个嵌套类而不是类成员,并给我一个错误:
error : using declaration can not refer to class member
我不明白为什么这不能解决问题:
using typename myLibrary::A::Nested;
编译器仍然给我完全相同的错误!
幸运的是,我有其他选择:
// Using a typedef
typedef myLibrary::A::Nested Nested;
// Using the new C++11 syntax for type aliasing
using Nested = myLibrary::A::Nested;
但我想了解为什么 using typename 指令不起作用。它不做我认为它做的事吗?或者它不是由编译器实现的?如果是后者,那有什么原因吗?
【问题讨论】:
-
据我所知,它只适用于命名空间成员,而不是类成员:en.cppreference.com/w/cpp/keyword/using
-
@DiscoStu:也许,但在这种情况下,为什么要引入“typename”关键字?它似乎应该使用:en.cppreference.com/w/cpp/language/using_declaration
-
您尝试使用 using 声明的上下文是什么?
-
Nested必须始终称为A::Nested,除非它位于A的成员变量或函数中。如果您的代码似乎要求在没有A::的情况下谈论Nested,这表明不将其作为嵌套类可能是更好的设计。 -
@MattMcNabb:如果你想知道,A 是描述机器人关节的类,而 Nested 是关节角度限制的结构。嵌套它对我来说很有意义,即使有时我必须从外部访问它。
标签: c++ using nested-class typename