如何按引用传递定义在其他类内部的enum class类型参数?
错误原因
你的报错本质是两个问题共同导致的:
- 循环头文件引用:
firstfile.h引用了secondfile.h,secondfile.h又反过来引用firstfile.h,头文件展开时编译器会先处理secondfile.h,此时还没有完成FirstFile类的定义,自然识别不了内部定义的enum1和enum2类型。 - 枚举类作用域缺失:
enum1和enum2是定义在FirstFile类内部的成员类型,在类外使用时必须加上FirstFile::作用域前缀,否则编译器找不到对应类型。
修复方案
这里提供两种常见的修复方式,选一种即可:
方案1:抽取枚举到单独头文件(最推荐,无循环依赖)
新增 enums.h 头文件,把两个枚举类移到全局作用域(也可以放到自定义命名空间中),解除两个业务类的头文件依赖:
// enums.h #pragma once enum class enum1 { Option1, Option2 }; enum class enum2 { Option3, Option4 };
然后修改各文件:
firstfile.h
#pragma once #include "secondfile.h" #include "enums.h" class FirstFile { protected: SecondFile secondobject; public: enum1 enumIn = enum1::Option1; enum2 enumInOut = enum2::Option3; public: void Function1(); };
secondfile.h
#pragma once #include "enums.h" class SecondFile { public: void function2(const enum1& enumIn, enum2& enumInOut); };
secondfile.cpp
#include <iostream> #include "secondfile.h" void SecondFile::function2(const enum1& enumIn, enum2& enumInOut) { if (enumIn == enum1::Option1) { enumInOut = enum2::Option4; } }
firstfile.cpp 和 main.cpp 不需要修改,直接编译即可运行。
方案2:保留枚举在FirstFile内部,调整头文件依赖
如果你不想把枚举抽出来,也可以通过调整头文件引用顺序+补全作用域解决(要求编译器支持C++11及以上标准):
- 所有头文件顶部加
#pragma once防止重复包含 - 删除
secondfile.h里的#include "firstfile.h",改为前置声明FirstFile类和内部枚举,同时补全参数的作用域前缀:
// secondfile.h #pragma once class FirstFile; // 前置声明FirstFile类 enum class FirstFile::enum1; // 前置声明内部强类型枚举 enum class FirstFile::enum2; class SecondFile { public: void function2(const FirstFile::enum1& enumIn, FirstFile::enum2& enumInOut); };
firstfile.h保留#include "secondfile.h",原有逻辑不需要修改secondfile.cpp补全枚举的作用域前缀即可:
// secondfile.cpp #include <iostream> #include "firstfile.h" #include "secondfile.h" void SecondFile::function2(const FirstFile::enum1& enumIn, FirstFile::enum2& enumInOut) { if (enumIn == FirstFile::enum1::Option1) { enumInOut = FirstFile::enum2::Option4; } }
内容的提问来源于stack exchange,提问作者Gamernaut
相关产品推荐
相关产品推荐

