我在我的一个类中的方法中使用了枚举的完全限定名.但我收到编译器警告,上面写着"警告C4482:使用非标准扩展名:enum'Foo'用于限定名称".在C++中,我们是否需要使用没有限定名称的枚举?但IMO,看起来很难看.
有什么想法吗?
是的,枚举不会创建新的"命名空间",枚举中的值可直接在周围范围内使用.所以你得到:
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
虽然某事确实回答了这个问题,但它没有解决我如何一直使用枚举的问题.即使它们只是或多或少的数字名称,我总是使用它们来定义只能具有某些值的类型.
如果枚举是该类的一部分,那么这有助于消费者清楚地识别枚举引用:
class Apple { enum Variety { Gala, GoldenDelicious, GrannySmith, Fuji } ... };
然后,消费者可以声明枚举的实例,作为参数传递,并在引用其中一种类型时限定它们.
unsigned int GetCountOfApples( Apple::Variety appleVariety ); ... fujiCnt = GetCountOfApples( Apple::Fuji );
有时候你想要在同一个班级中的一个或两个枚举之外的枚举,你可以做像Poy那样的事情.您将无法引用枚举类型,因此请将其命名.
namespace Color { enum ColorEnum { Blue, Red, Black };
现在使用枚举和值将像:
Color::ColorEnum firstColor = Color::Blue; Color::ColorEnum secondColor = Color::Red; if( firstColor == secondColor ) ....
现在,如果恰好有不同名称的枚举,那么它们将始终符合它们的类型.然后你可以处理gamblor所询问的事情.
BananaColorEnum banCol = BananaColor::Yellow; TomatoColorEnum tomCol = TomatoColor::Yellow;
是.从概念上讲,枚举定义了一种类型,以及该类型的可能值.虽然看起来很自然,但定义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.而且优点是您可以使用命名空间运算符并传递冲突.缺点是,你必须编写Fruit :: Value而不是Fruit.当你不知道其他类中的枚举是什么时,它在大型项目中更有用.
如果可以使用C++ 11,则更简单,因为enum :: namespace语法是可行的.
我发现这样做最干净的方法是定义枚举
namespace Samples { enum Value { Sample1, Sample2, Sample3 }; } typedef Samples::Value Sample;
然后在函数和变量定义中,您可以使用typedef:
void Function(Sample eSample); Sample m_eSample;
在.cpp文件中,您可以使用命名空间来分配变量:
void Function(Sample eSample) { m_eSample = Samples::Sample1; eSample = Samples::Sample2; }