我有一些看起来像这样的代码:
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 指令不起作用。它不做我认为它做的事吗?还是编译器没有实现?如果是后者,有什么原因吗?
最佳答案
没有“使用类型名指令”。有using-directives 和using-declarations。
您没有使用任何using-directives,并且它们在任何情况下都与问题无关(它们命名 namespace ,并且不能使用 typename 关键字)。
当 using-declarations 碰巧出现在类模板中,并且碰巧命名依赖类型时,它们必须使用 typename
关键字,就像任何其他碰巧是在模板中,恰好命名了一个依赖类型。
例如:
template <typename A, typename R>
class Functor : public std::unary_function<A, R>
{
using typename std::unary_function<A, R>::result_type;
using typename std::unary_function<A, R>::argument_type;
public:
result_type operator() (argument_type) {}
};
在您的情况下, namespace 声明似乎不是类模板主体的一部分,实际上它似乎在 namespace 范围内,在这种情况下尝试命名类成员(无关紧要如果它是类型或函数或其他)违反 7.3.3[namespace.udecl]/8
A using-declaration for a class member shall be a member-declaration
编译器正确诊断为“错误:使用声明不能引用类成员”
关于c++ - 编译器没有实现 "using typename"指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847774/