类内枚举跨类访问问题:VS2010正常G++编译报错
解决类内枚举在G++中无法通过
TestMgr::Mode::kDefault访问的问题 这个问题的核心是不同编译器对C++标准的支持差异:
- VS2010的MSVC编译器做了非标准扩展,允许你用
TestMgr::Mode::kDefault这种方式访问类内枚举的成员; - 而G在默认的C03标准模式下,严格遵循旧版C++规范:类内的普通枚举值是直接属于类的作用域,而不是枚举类型
Mode的作用域,所以TestMgr::Mode::kDefault这种写法会被判定为非法。
给你两种可行的解决方案:
方案一:兼容C++03的写法
直接跳过枚举类型名,通过类作用域直接访问枚举值,这种写法在所有编译器下都能正常工作:
#include"Manager.h" int main() { TestMgr::Mode _mode = TestMgr::kDefault; }
方案二:使用C++11强类型枚举(更推荐)
如果你的项目可以升级到C++11及以上标准,建议把普通枚举改成enum class(强类型枚举),它的枚举值会严格属于枚举类型的作用域,同时还能带来更好的类型安全性。
修改Manager.h中的枚举定义:
class TestMgr { public: enum class Mode { kError, kRun, kFly, kDefault = kRun }; };
main.cpp中的代码可以保持不变,但编译G时需要指定C11及以上标准,比如:
g++ main.cpp -std=c++11
也可以使用更高版本的标准参数,比如-std=c++17。
这样修改后,不管是VS还是G++都能正常编译,同时还能避免普通枚举隐式转换为整数的潜在问题。
内容的提问来源于stack exchange,提问作者S_R
相关产品推荐
相关产品推荐

