当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用枚举内部类型-编译器警告C4482C++》经验,为你挑选了6个好方法。

我在我的一个类中的方法中使用了枚举的完全限定名.但我收到编译器警告,上面写着"警告C4482:使用非标准扩展名:enum'Foo'用于限定名称".在C++中,我们是否需要使用没有限定名称的枚举?但IMO,看起来很难看.

有什么想法吗?



1> sth..:

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

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

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



2> 小智..:

要使其清洁,请更换:

enum Fruit {

    ORANGE = 0,
    BANANA = 1

};

namespace Fruit {

    enum { //no enum name needed

        ORANGE = 0,
        BANANA = 1

    };

};

...

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


我不喜欢这种方法,因为变量的类型没有暗示,它是一个枚举.
我喜欢这种方法.(我也来自Java.)我不明白没有名字限定枚举的智慧.我很想知道其基本原理.

3> jmc..:

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

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

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;



4> Rob K..:

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


@Simón:您只在Visual Studio上获得该警告,Visual Studio将其实现为编译器扩展.海湾合作委员会没有; 除非你正在编译为C++ 11(它是合法的语法).

5> Tomas Kubes..:

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语法是可行的.



6> petejamd..:

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

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

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有