警告 C4481 枚举中使用的非标准扩展名'MyEnum'限定名称中使用
Warning C4481 nonstandard extension used in enum 'MyEnum' used in qualified name
我正在尝试从我正在处理的类中删除警告。
警告如下:
警告C4482:使用了非标准扩展:enum"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++11以来,通过枚举名称限定枚举器是标准C++。
在此之前,您无法用标准C++编写MyEnum::Value1
。然而,微软甚至在标准化之前就允许将其作为扩展。
VC10警告您,您的资格认证正在使用扩展,而不是标准的东西。如果内存服务于C++11,则它不是VC10使用的默认标准。
由于这是一个C头,并且枚举器名称始终是封闭作用域的成员,所以您没有追索权,只能用C方式"限定"它们
enum MyEnum {
MyEnum_Value1
};
我不相信标准C中有任何::运算符,所以即使在结构中,枚举值也很可能只是全局符号。在C++中,如果它位于结构、类或命名空间中,则可以使用该运算符访问它。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 预处理器:插入结构名称中的前一个行号
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 基类中的函数名称解析
- 模板元程序查找相似的连续类型名称
- 没有名称的C++模板参数
- C++中名称篡改的目的是什么
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 如何仅使用对象名称打印特定于对象的成员
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 为什么 Clang 不允许"and"作为函数名称?
- 遮罩结构名称
- c++binary_search函数排序数组(流行名称搜索)出现问题
- RegGetValue在当前用户下找不到名称
- C++中名称查找和名称绑定之间的区别
- 警告 C4481 枚举中使用的非标准扩展名'MyEnum'限定名称中使用
- 在C++中具有名称绑定的EDSL