使用枚举内部类型 - 编译器警告C4482 C ++

时间:2009-02-05 01:38:48

标签: c++ enums compiler-warnings

我在我班级的一个方法中使用了enum的完全限定名。但我收到的编译器警告显示“警告C4482:使用非标准扩展名:enum'Foo'用于限定名称”。在C ++中,我们是否需要使用没有限定名称的枚举?但IMO,看起来很难看。

有什么想法吗?

8 个答案:

答案 0 :(得分:58)

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

enum sample {
  SAMPLE_ONE = 1,
  SAMPLE_TWO = 2
};

int main() {
  std::cout << "one = " << SAMPLE_ONE << std::endl;
  return 0;
}

答案 1 :(得分:39)

要使其清洁,请替换:

enum Fruit {

    ORANGE = 0,
    BANANA = 1

};

namespace Fruit {

    enum { //no enum name needed

        ORANGE = 0,
        BANANA = 1

    };

};

...

int f = Fruit::BANANA; //No warning

答案 2 :(得分:15)

虽然某事确实回答了这个问题,但它没有解决我如何一直使用枚举的问题。即使它们只是或多或少的数字名称,我总是使用它们来定义只能具有特定值的类型。

如果枚举是该类的一部分,那么这有助于消费者清楚地识别枚举引用:

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;

答案 3 :(得分:11)

是。从概念上讲,枚举定义了一种类型,以及该类型的可能值。尽管看起来很自然,但定义enum foo { bar, baz };然后引用foo::baz与引用int::1相同。

答案 4 :(得分:8)


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语法。

答案 5 :(得分:7)

我发现这样做最干净的方法是将枚举定义为

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;
}

答案 6 :(得分:1)

就个人而言,我认为这是一个编译器错误。我已经使用C ++很多时间了。可悲的是,OP中没有示例代码。 Java人员对枚举的解释实际上是正确的iMO。我的,就像这样......

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

我也尝试过,Foo :: tMyEnum :: eFirstVal。没有限定符,所有内容都会编译。

答案 7 :(得分:0)

我遇到了同样的问题,我还没有使用C ++ 11。我自己也更喜欢完全合格的命名空间。

我禁用了此特定警告。我相信人们会不喜欢这个想法,但有些人可能会感激不尽。

#pragma warning( disable : 4482 )