使用枚举内部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。 没有限定词,一切都编译好了。