class - 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”
有人知道如何解决这个“问题”吗?
谢谢
解决方案
您可以前向声明作用域枚举,但在您引用实际枚举标识符(例如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"
。
推荐阅读
- c# - 在不创建类的情况下通过 JSON 将 List 从 MVC 控制器传递到 View 是否可行?
- javascript - 与淘汰赛 js 一起使用时,Bootstrap 模型无法正确关闭
- javascript - 如何检查“key”是否正确填充了 JSON 文件中的“已知”值
- php - 即使我得到了会话值,PHP 回显也无法使用会话值
- asp.net-mvc - applicationuser 和自定义实体之间的一对多关系
- python - 如何将我的所有库依赖项打包在轮文件中?
- javascript - ReactJS - 使用 D3 嵌入 Svg 图像
- google-app-engine - 电报机器人在一小段时间后停止服务
- javascript - 基于弹出值的条件变量定义
- python - 如何在 python 中查找/阅读有关方法和模块的文档?