2010-10-05 3 views
3
typedef enum{ 
Adjust_mode_None = 0, 
Adjust_mode_H_min, 
Adjust_mode_H_max, 
Adjust_mode_S_min, 
Adjust_mode_S_max, 
Adjust_mode_V_min, 
Adjust_mode_V_max 
}Adjust_mode; 

et à un moment donné que je veux faire:typedef enum

adjust_mode_ = (adjust_mode_+1)%7; 

mais je reçois une conversion non valide de int à Adjust_mode

Ceci est ok dans d'autres langues, ce qui est faux en C++? dois-je définir un opérateur?

Répondre

4

Oui, vous pouvez définir un opérateur ...

Adjust_mode operator+(Adjust_mode lhs, int rhs) 
{ 
    return static_cast<Adjust_mode>(
       (static_cast<int>(lhs) + rhs) % 7); 
} 

Adjust_mode operator+(int lhs, Adjust_mode rhs) 
{ 
    return static_cast<Adjust_mode>(
       (lhs + static_cast<int>(rhs)) % 7); 
} 

Notez que vous avez besoin des deux pour permettre adjust_mode_ + 1 et 1 + adjust_mode_ pour travailler. Si vous ne fournissez qu'une seule fonction operator+(Adjust_mode, Adjust_mode) alors l'une ou l'autre des expressions ci-dessus convertirait plutôt l'enum en un int et retournerait un résultat int.

C'est assez hackish, il vaut donc mieux utiliser une fonction nommée normale pour effectuer l'opération, plutôt que d'utiliser un opérateur qui peut être trop facilement appelé par accident.

5

utilisez static_cast. Vous avez besoin d'une conversion explicite.

adjust_mode_ = static_cast<Adjust_mode>(adjust_mode_+1)%7; 
+0

Merci, ça a marché! adjust_mode_ = static_cast ((adjust_mode_ + 1)% 7); – nacho4d