命名空间中使用枚举在Qt GUI程序报错,控制台正常,原因何在?
问题:Qt GUI项目中命名空间内枚举访问出错
我在代码里的命名空间中使用了枚举,代码如下:
namespace Statusss { enum Statuss { Out = -1, Ok = 0, Busy = 1, Error = 2, Nor = 3 }; } void tst() { int status =0; Statusss::Statuss mystatus = static_cast<Statusss::Statuss>(status); if (mystatus == (Statusss::Statuss::Ok)) { std::cout << "Ok\n"; } else std::cout << "Other\n"; }
这段代码在普通控制台程序里运行正常,但放到Qt GUI Widget应用中时,出现了如下错误:
'Statusss::Statuss' is not a class or namespace if (mystatus == (Statusss::Statuss::Ok)) ^
请问出现这个错误的原因是什么?
这问题本质是C++标准版本差异以及新旧枚举类型的语法规则导致的,我来给你拆解清楚:
你当前定义的是C++03风格的旧式枚举,这种枚举的成员是直接属于所在命名空间的,而不是枚举类型本身。也就是说,正确的访问方式应该是Statusss::Ok,而不是Statusss::Statuss::Ok——后者是C++11引入的**强类型枚举(enum class)**才支持的写法。
那为什么控制台程序能正常运行?大概率是你的控制台项目默认启用了C11或更高版本的标准,部分编译器在高版本标准下会对旧式枚举的这种“伪强类型访问”做兼容处理,睁一只眼闭一只眼就过了。但Qt Widget项目的编译器配置可能默认使用了更早的C标准(比如C++03),或者开启了更严格的语法检查,所以就直接报错了。
两种解决办法任你选:
- 适配旧式枚举的语法:把判断条件里的
Statusss::Statuss::Ok改成Statusss::Ok,代码就能正常编译了。 - 升级为C++11强类型枚举:把枚举定义改成
enum class形式,这样Statusss::Statuss::Ok的写法就合法了,修改后的枚举代码如下:
namespace Statusss { enum class Statuss { Out = -1, Ok = 0, Busy = 1, Error = 2, Nor = 3 }; }
同时记得在Qt项目的.pro文件里确认开启了C++11及以上标准(Qt 5.11+默认已开启,显式添加更稳妥):
CONFIG += c++11
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

