gpt4 book ai didi

c++ - 警告 C4481 非标准扩展用于枚举 'MyEnum' 用于合格名称

转载 作者:行者123 更新时间:2023-11-30 00:43:27 26 4
gpt4 key购买 nike

我正在尝试从我正在处理的类(class)中删除警告。

警告如下:

Warning C4482: nonstandard extension used: enum 'MyEnum' used in qualified name

我知道警告是由于尝试访问枚举中的值之一引起的,如下所示:

//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++11 开始,通过枚举名称限定枚举器是标准 C++。

在此之前,您无法用标准 C++ 编写 MyEnum::Value1。然而,微软甚至在标准化之前就允许它作为扩展。

VC10 警告您,您的资格使用的是扩展而不是标准的东西。如果内存服务,C++11 不是 VC10 使用的默认标准。

因为这是一个 C 头文件,并且枚举器名称始终是封闭范围的成员,所以您别无选择,只能以 C 方式“限定”它们

enum MyEnum { 
MyEnum_Value1
};

关于c++ - 警告 C4481 非标准扩展用于枚举 'MyEnum' 用于合格名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54509717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com