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

标签 c++ using nested-class typename

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

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/

相关文章:

c++ - 具有嵌套类的模板类

php - Laravel:嵌套 Controller 并使父 Controller 重定向到子 Controller ?

c++ - 本地类、内部类和嵌套类在C++中是一回事吗?

c++ - 带有虚拟 COM 端口的 USB 串行设备 - 如果将 CreateFile() 与 USB 路径一起使用,ReadFile() 读取零字节

c++ - "using namespace std"有什么用?

c++ - 内联 getter 和 setter 与公共(public)变量

C++ 使用别名访问嵌套类型(使用 vs typedef)

c# - 类似于 "using"的东西,它会创建一个对象并在完成后调用它的方法,但让我在两者之间做我想做的事

c++ - 在现实生活中管理 char *

c++ - 如何在 qi 符号表中使用 std::function