Class c+的拆分声明和定义+;枚举类

Class c+的拆分声明和定义+;枚举类,class,c++11,enums,Class,C++11,Enums,我希望以以下方式使用enum类 // Foo.h enum class Foo : uint8_t; 与 及 但我得到以下错误 嵌套名称说明符中命名的类型“Foo”不完整 有人知道如何解决这个“问题”吗 谢谢您可以转发声明作用域枚举,但在引用实际枚举标识符时(例如,Foo::Foo),编译器必须可以使用完整的枚举定义 通常,作用域枚举既不是通过接口传递的实现细节,也不是编译时的瓶颈。因此,简单的解决方法是将定义放入头文件中 // Foo.h enum class Foo : uint8_t {

我希望以以下方式使用enum类

// Foo.h
enum class Foo : uint8_t;

但我得到以下错误

嵌套名称说明符中命名的类型“Foo”不完整

有人知道如何解决这个“问题”吗


谢谢

您可以转发声明作用域枚举,但在引用实际枚举标识符时(例如,
Foo::Foo
),编译器必须可以使用完整的枚举定义

通常,作用域枚举既不是通过接口传递的实现细节,也不是编译时的瓶颈。因此,简单的解决方法是将定义放入头文件中

// Foo.h
enum class Foo : uint8_t {
  FOO = 0,
  BAR = 1
};
但当您明确要求单独声明和定义时,您可能需要:

// FooFwd.h
enum class Foo : uint8_t;

Foo.h
中的定义如上所述。然后,每当你想使用一个枚举实例而不引用它的实际枚举数时,你可以只
#包括“FooFwd.h”
,如果你需要访问例如
Foo::Foo
,就使用
#包括“Foo.h”

,我不想在Foo.h或FooFwd.h中赋值。这些值只能在.cpp文件中使用/分配。如果在某些转换单元中定义枚举,则只能引用该转换单元中的枚举器。枚举将是非常无用的。此外,在编辑问题时提供多个定义也违反了“一个定义”规则。您应该只定义一次。不理解一个定义规则问题“g++MainLinkedWithFoo.cpp Foo.cpp”或“g++MainLinkedWithBar.cpp Bar.cpp”好的,我明白了,您不会将两个定义链接到一个可执行文件中。那么就没有ODR冲突,但是如果没有现有的定义,仍然不能引用
Foo::Foo
// Foo.h
enum class Foo : uint8_t {
  FOO = 0,
  BAR = 1
};
// FooFwd.h
enum class Foo : uint8_t;