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

这是当前的API:

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

换句话说,用户当前希望使用Inner设置Outer::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;
}

最佳答案

由于规则[basic.scope.class] / 3,因此不允许这样做:



当您执行typedef Inner Inner;时,您违反了此规则。 Inner第一次出现在该行上,这是对名称的使用,并且被发现引用了::Inner声明。但是,一旦完全定义了类,Inner现在就引用typedef声明。因此,该程序是格式错误的NDR(GCC足以为您提供诊断信息)。

您需要将其更改为:

typedef ::Inner Inner;

现在,不再使用不合格的名称Inner了;相反,您使用的是限定名称::Inner,其含义在typedef之后保持不变,因此应该没有问题。

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

10-13 08:20