c++ - 为什么我不能使外部类型看起来像 C++ 中的内部类型?

标签 c++ typedef inner-classes

我想维护一个大量使用内部枚举的现有 API,但我需要将枚举分离成它自己的类型:

这是当前的 API:

class Outer {
public:
    enum Inner {
        FIELD1
    };
};

换句话说,用户目前希望通过使用Outer::Inner 来设置Inner。 我想在制作新的外部类型时尽可能保留名称:

enum Inner {
    FIELD1
};

class Outer {
public:
    typedef Inner Inner;
}

但是 - 它给了我一个编译器错误:

./Playground/file0.cpp:23:19: error: declaration of 'typedef enum Inner Outer::Inner' changes meaning of 'Inner' [-fpermissive]
   23 |     typedef Inner Inner;
      |                   ^~~~~
./Playground/file0.cpp:17:6: note: 'Inner' declared here as 'enum Inner'
   17 | enum Inner {
      |      ^~~~~

如果我只是更改枚举的名称,一切正常。

#include <cassert>

enum Enum {
    FIELD1
};

class Outer {
public:
    typedef Enum Inner;
};

int main() {

    Enum field = Enum::FIELD1;
    Outer::Inner field_alt = Outer::Inner::FIELD1;
    assert(field == field_alt);
    return 0;
}

最佳答案

Innertypedef 需要引用 outer scope 中的 Inner 枚举,因此它应该看起来像这样:

typedef ::Inner Inner;

不过,我通常更喜欢使用 using 语句,它看起来像这样:

using Inner = ::Inner;

这是一个 demo

关于c++ - 为什么我不能使外部类型看起来像 C++ 中的内部类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61645278/

相关文章:

c++ - 从 CArray 指针访问值

c - 分配结构体矩阵

c - 类型定义/结构声明

c++ - 标准中哪里说下面的 typedef 是有效的?

java - 如何访问同一对象的 getInstance 方法中内联实现的接口(interface)方法中的对象

c++ - (错误) 'operator>>' 中的 'std::cout >> namesArray(counter)(0)' 不匹配

c++ - C 代码转换为 C++ sha1 问题

c++ - 模板成员变量特化

scala - 如何访问 Scala 中的 "overridden"内部类?

java - 在其中创建静态嵌套类的实例