首页 > 解决方案 > c++枚举类的拆分声明和定义

问题描述

我想通过以下方式使用枚举类

// Foo.h
enum class Foo : uint8_t;

// Foo.cpp
enum class Foo : uint8_t {
  FOO = 0,
};

// Bar.cpp
enum class Foo : uint8_t {
  FOO = 1,
};

// MainLinkedWithFoo.cpp
#include "Foo.h"
int main () {
  (void)Foo::FOO;
  return 0;
}

// MainLinkedWithBar.cpp
#include "Foo.h"
int main () {
  (void)Foo::FOO;
  return 0;
}

但我收到以下错误

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

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

谢谢

标签: classc++11enums

解决方案


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

大多数情况下,作用域枚举既不是通过接口传递的实现细节,也不是编译时间的瓶颈。因此,直接的解决方法是将定义放入头文件中。

// Foo.h
enum class Foo : uint8_t {
  FOO = 0,
  BAR = 1
};

但是当您明确要求单独的声明和定义时,您可能想要这样:

// FooFwd.h
enum class Foo : uint8_t;

和上面的定义Foo.h。然后,每当您想使用枚举实例而不引用其实际枚举数时,您可以只#include "FooFwd.h"使用 ,如果您需要访问例如Foo::FOO,请使用#include "Foo.h"


推荐阅读