使用枚举内部types – 编译器警告C4482 C ++

我在我的一个类中使用方法中的完全限定的名称。 但我收到编译器警告说: “警告C4482:非标准扩展使用:在合格的名称中使用枚举'Foo'” 。 在C ++中,我们是否需要使用没有限定名称的枚举? 但海事组织,这看起来很丑。

有什么想法吗?

是的,枚举不会创build一个新的“命名空间”,enum中的值可以在周围的范围中直接使用。 所以你得到:

enum sample { SAMPLE_ONE = 1, SAMPLE_TWO = 2 }; int main() { std::cout << "one = " << SAMPLE_ONE << std::endl; return 0; } 

要使其清洁,请更换:

 enum Fruit { ORANGE = 0, BANANA = 1 }; 

 namespace Fruit { enum { //no enum name needed ORANGE = 0, BANANA = 1 }; }; ... int f = Fruit::BANANA; //No warning 

虽然某事确实回答了这个问题,但并没有说明我总是使用枚举。 尽pipe它们只是数字的名称,但我总是用它们来定义只能有一定数值的types。

如果枚举是类的一部分,那么可以帮助消费者清楚地识别枚举引用:

 class Apple { enum Variety { Gala, GoldenDelicious, GrannySmith, Fuji } ... }; 

然后消费者将能够声明枚举的实例,作为parameter passing,并在引用其中一种types时限定它们。

 unsigned int GetCountOfApples( Apple::Variety appleVariety ); ... fujiCnt = GetCountOfApples( Apple::Fuji ); 

有时候你想在同一个class的一个或两个枚举之外的枚举,你可以像Poy所做的那样。 你将不能够引用枚举types,所以只要命名它。

 namespace Color { enum ColorEnum { Blue, Red, Black }; 

现在使用枚举和值将工作如下:

 Color::ColorEnum firstColor = Color::Blue; Color::ColorEnum secondColor = Color::Red; if( firstColor == secondColor ) .... 

现在,如果碰巧有不同的枚举名,那么它们总是会以它们的types为准。 然后,你可以处理什么gamblor问。

 BananaColorEnum banCol = BananaColor::Yellow; TomatoColorEnum tomCol = TomatoColor::Yellow; 

是。 从概念上来说,枚举定义了一个types,以及该types的可能值。 尽pipe看起来很自然,但要定义enum foo { bar, baz }; 然后引用foo::baz就像引用int::1

 namespace Company { typedef int Value; enum { Microsoft= 0, APPLE = 1, }; }; namespace Fruit { typedef int Value; enum { ORANGE = 0, BANANA = 1, APPLE = 2, }; }; ... Fruit::Value f = Fruit::BANANA; //No warning Company::Value f = Company::APPLE; //is different value then Fruit::APPLE 

这适用于GCC和MS编译器和Mac。 优点是你可以使用命名空间运算符并传递冲突。 这个小缺点是,你不得不写水果::价值。 当你不知道其他类中的枚举是什么时,它在大型项目中更有用。

如果可以使用C ++ 11,则更为简单,因为可以使用enum :: namespace语法。

我发现这样做的最简洁的方法是定义枚举

 namespace Samples { enum Value { Sample1, Sample2, Sample3 }; } typedef Samples::Value Sample; 

然后在函数和variables定义中可以使用typedef:

 void Function(Sample eSample); Sample m_eSample; 

在你的.cpp文件中,你可以使用命名空间来分配variables:

 void Function(Sample eSample) { m_eSample = Samples::Sample1; eSample = Samples::Sample2; } 

我个人认为这是一个编译器错误。 我一直在使用C ++很多时间。 可悲的是,OP中没有示例代码。 爪哇人对enum的解释实际上是正确的iMO。 我的,就是这样

 class Foo { enum tMyEnum { eFirstVal = 0, eSecondVal = 1}; // ... tMyEnum m_myVal; }; void Foo::MyMethod() { if(m_myVal == tMyEnum::eFirstVal) { // ... } } 

我也试过,Foo :: tMyEnum :: eFirstVal。 没有限定词,一切都编译好了。