2009-07-02 4 views
2

Nous avons un code qui ressemble à peu près comme ceci:Résolution de surcharge avec deux énumérations

// Two enums that differ entirely. 
enum A { a1, a2 }; 
enum B { b1, b2 }; 

// Functions to convert in some meaningful way between them 
A convert(B); 
B convert(A); 

Maintenant, notre compilateur va et fait exactement ce que nous nous attendons à. convert(a1) appellera B convert(A), et ainsi de suite. Cependant, quand nous utilisons Lint pour regarder notre code, il se plaint de l'erreur 31. Nous suspectons que c'est parce que le type intégral sous-jacent des énumérations est le même, et donc Lint pourrait les traiter comme tel.

La question que j'ai est: est le code standard, ou est-ce une utilisation accidentelle d'une fonctionnalité de compilateur?

+0

Addendum, erreur 31 est "tenter de redéfinir une fonction". Je surveille attentivement cette question et j'ajouterai volontiers une réponse à la question qui concerne le standard. –

Répondre

4

Ce code est standard et correct. Le bug est dans LINT

+0

Même si je suis du même avis, y a-t-il une chance que vous puissiez en parler un peu? Je n'ai pas de chapitre et de verset devant moi :( –

0

Je ne suis pas sûr qu'il serait considéré comme standard de renvoyer un enum plutôt qu'un typedef'd enum de cette façon, mais je pourrais me tromper. Aussi, en tant que programmeur C, j'éviterais d'utiliser le même nom pour les deux fonctions (car la surcharge est impossible), mais j'ai tendance à l'éviter en C++ de toute façon car il est facile de faire une erreur.

Si je devais écrire ce code, j'aurais quelque chose comme:

typedef enum { a1, a2 } A; 
typedef enum { b1, b2 } B; 
A convertBToA(B BInstance); 
B convertAToB(A AInstance); 

Cependant, je me attends à Lint pour être heureux (en C++) avec:

typedef enum { a1, a2 } A; 
typedef enum { b1, b2 } B; 
A convert(B BInstance); 
B convert(A AInstance); 
+0

Utiliser le même nom facilite l'appel de la fonction à partir d'un modèle –

+0

Vrai .J'ai utilisé cela dans le passé, mais je suppose que j'écris beaucoup de code C (où c'est impossible) que j'ai l'habitude d'avoir des noms distincts avec tout.Même si les règles de MISRA-C++ n'excluent pas la surcharge, il y a beaucoup de restrictions liées à cela, donc il doit être utilisé avec précaution – DrAl

+0

Un typedef est un synonyme pour un autre type La seule différence significative entre l'utilisation du nom de typedef et celle de la chose que vous avez typée est qu'un objet ou une fonction ne cachera pas le nom d'un typedef comme ils seront le type. –