gpt4 book ai didi

c++ - 编译器没有实现 "using typename"指令吗?

转载 作者:可可西里 更新时间:2023-11-01 18:32:19 26 4
gpt4 key购买 nike

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

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-directivesusing-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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com