65 votes

Utilisation d'enum à l'intérieur de types - Avertissement du compilateur C4482 C++

J'utilise le nom pleinement qualifié de l'enum dans une méthode d'une de mes classes. Mais j'obtiens un avertissement du compilateur qui dit "warning C4482 : extension non standard utilisée : enum 'Foo' utilisé dans le nom qualifié". . En C++, devons-nous utiliser les enums sans le nom qualifié ? Mais, selon l'OMI, c'est très laid.

Des idées ?

59voto

sth Points 91594

Oui, les enums ne créent pas un nouvel "espace de noms", les valeurs de l'enum sont directement disponibles dans la portée environnante. Donc, vous obtenez :

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

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

39voto

Poy Points 289

Pour le rendre propre, remplacez-le :

enum Fruit {

    ORANGE = 0,
    BANANA = 1

};

avec

namespace Fruit {

    enum { //no enum name needed

        ORANGE = 0,
        BANANA = 1

    };

};

...

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

15voto

jmc Points 208

Bien que qqch réponde à la question, il n'a pas abordé la façon dont j'ai toujours utilisé les enums. Même s'il s'agit plus ou moins de noms pour des nombres, je les ai toujours utilisés pour définir des types qui ne peuvent avoir que certaines valeurs.

Si l'énumération fait partie de la classe, cela aide les consommateurs à identifier clairement une référence à une énumération :

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

Les consommateurs pourraient alors déclarer des instances de l'enum, les passer comme paramètres et les qualifier lorsqu'ils font référence à l'un des types.

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

Parfois, vous voulez un enum en dehors d'une classe ou deux enums dans la même classe, et vous pouvez faire quelque chose comme ce que Poy avait. Cependant, vous ne pourrez pas référencer le type d'enum, il suffit de le nommer.

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

Maintenant, l'utilisation de l'enum et des valeurs fonctionnerait comme suit :

Color::ColorEnum firstColor = Color::Blue;
Color::ColorEnum secondColor = Color::Red;

if( firstColor == secondColor )
....

Maintenant, s'il y a différents enums avec le même nom, ils seront toujours qualifiés avec le type qu'ils sont. Vous pourriez alors gérer la question de Gamblor.

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

12voto

Rob K Points 3453

Oui. Conceptuellement, l'enum définit un type, et les valeurs possibles de ce type. Même si cela semble naturel, de définir enum foo { bar, baz }; et ensuite se référer à foo::baz est la même chose que de se référer à int::1 .

9voto

qub1n Points 817
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

Cela fonctionne sur GCC et MS compiler et Mac. Et l'avantage est que vous pouvez utiliser l'opérateur namespace et passer les conflits. Le petit inconvénient est qu'au lieu de Fruit, vous devez écrire Fruit::Value. C'est plus utile dans les grands projets quand vous ne savez pas quels enums sont dans les autres classes.

S'il est possible d'utiliser C++11 à la place, c'est beaucoup plus simple, car la syntaxe enum::namespace est alors possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X