如何阻止枚举存为变量时转int?C++枚举类函数调用报错
解决C++枚举类参数函数调用报错问题
头文件代码
namespace MyEnumNamespace { enum class MyEnum { One, Two, Three }; } class TestClass { public: TestClass(); void setMyEnum(MyEnumNamespace::MyEnum e); void doOtherStuff(MyEnumNamespace::MyEnum e); void doStuff(); private: MyEnumNamespace::MyEnum mEnum; };
实现文件(.cpp)代码
TestClass::TestClass() { setMyEnum(MyEnumNamespace::MyEnum::One); doStuff(); } void TestClass::setMyEnum(MyEnumNamespace::MyEnum e) { mEnum = e; } void TestClass::doOtherStuff(MyEnumNamespace::MyEnum e) { } void TestClass::doStuff() { doOtherStuff(e); }
编译错误信息
error C2672: 'doOtherStuff': no matching overloaded function found
问题原因与解决方法
你猜测的枚举隐式转换为int的问题并不存在,真正的错误是doStuff函数里的e是未定义的变量——你实际想传递的是类的私有成员mEnum,而非凭空写的e。
编译器找不到匹配的doOtherStuff重载,是因为它无法识别e这个变量的类型(甚至根本不知道这个变量存在),自然无法匹配到参数为MyEnumNamespace::MyEnum的函数版本。
修复代码
只需把doStuff函数里的调用修改为:
void TestClass::doStuff() { doOtherStuff(mEnum); }
这样就正确传递了成员变量mEnum,其类型与doOtherStuff的参数完全匹配,不会触发任何隐式转换问题。
额外的代码修正提示
- 头文件中
TestClass的类定义末尾缺少分号;,这会导致编译错误,必须补上。 - 原cpp文件中的构造函数定义遗漏了
TestClass::前缀,正确写法应为TestClass::TestClass(),否则编译器会将其识别为一个独立的函数,而非类的构造函数。
内容的提问来源于stack exchange,提问作者user22502145
相关产品推荐
相关产品推荐

