【发布时间】:2019-06-27 19:32:45
【问题描述】:
我正在尝试从我正在处理的课程中删除警告。
警告如下:
警告 C4482:使用了非标准扩展:枚举“MyEnum” 用于限定名
我了解警告是由尝试访问枚举中的值之一引起的,如下所示:
//Declared in a C header file.
enum MyEnum
{
Value1,
Value2,
Value3
};
//Exists in some other .cpp file.
void SomeFunc()
{
MyEnum::Value1; //Generates warning C4482
}
仅供参考:SomeFunc() 存在于 .cpp 文件中,但枚举是在 C 头文件中声明的。
因此,我可以删除警告的一种方法是仅将 MyEnum::Value1 替换为 Value1。但是我更愿意使用 MyEnum::Value1 来引用枚举值,因为我喜欢它更明确。
所以如果我只使用 C++,我可以像这样更改枚举:
namespace MyEnum
{
enum
{
Value1,
Value2,
Value3
};
}
但是枚举存在于 C 头文件中,因此我无法将枚举包装在命名空间中。我也无法将枚举移动到 C++ 头文件中,因为其他文件已经依赖于枚举。
我考虑的一种方法是将枚举包装在一个结构中:
struct MyEnum
{
enum Type
{
Value1,
Value2,
Value3
};
};
这将允许我使用 MyEnum::Value1 访问值而不引发警告。
但是,有没有更好的方法来实现这一点?
此外,我还遇到过枚举存在于 C++ 文件中但其作用域为类的情况:
class MyClass
{
enum MyEnum
{
Value1,
Value2,
Value3
};
};
我不想将它移出类,因为类提供了枚举的封装,但我也不能将枚举包装在命名空间中,因为类声明中不允许命名空间。有没有更好的方法在这种情况下实现相同的行为 (MyEnum::Value1) 而不会发出相同的警告?
仅供参考:我仅限于 vc10 允许的实现。
【问题讨论】:
-
也许你可以在 C++ 中使用
enum class MyEnum -
是的,我认为 enum 类可以在另一个类中使用,这对于第二种情况很好了解。但是我不确定vc10是否支持它,我必须检查一下并在发现时发布。
-
我的发现表明 vc10 不支持枚举类,但仍然很高兴知道。