12
votes

Utilisez la classe et l'enum avec le même nom?

J'ai une classe et une valeur d'énorme qui ont le même nom. À l'intérieur de la classe, je veux utiliser l'énumé qui donne une erreur. Y a-t-il un moyen d'utiliser l'ENUM sans em> renommer ou de passer à un espace de noms différent?

Exemple: p>

namespace foo {
    enum bar {
        BAD
    };

    class BAD {
        void worse () {
            bar b = BAD; // error
        }
    };
};


1 commentaires

Pour améliorer la lisibilité, je vous recommande fortement de choisir des noms différents pour Enum et Classe . N'oubliez pas que un meilleur objectif est de produire des logiciels faciles à entretenir plutôt que d'invoquer des subtilités dans le compilateur ou la langue.


4 Réponses :


0
votes

Non, il n'y a aucun moyen de le faire. Vous devez utiliser un identifiant valide. Identificateur valide signifie que vous devez être capable de identifier avec elle. :)


0 commentaires

5
votes
class BAD b;

1 commentaires

Quelqu'un voulait savoir si je l'ai essayé. J'ai fait avec 3 compilateurs différents, y compris le como. Les règles sont arcaniques, si je me souviens quand j'ai le temps, je vais donner une explication plus complète avec des références.



0
votes

Ceci fonctionne dans VS2008, mais donne un avertissement:

bar b = bar::BAD;


1 commentaires

C'est la syntaxe C ++ 0X et c'est la solution préférée si disponible. Ma solution est la syntaxe C ++ 03 (mais utilisez des règles d'arcan).



10
votes

C'est l'une de ces parties difficiles de la manière dont la recherche de nom est effectuée.

Il existe deux scopes d'identifiant en C ++, une pour les types de classe et la portée générale d'identifiant. La valeur Enum réside dans la portée générale de l'identifiant, tandis que la barre de type de classe réside dans la portée de l'identifiant de la classe. C'est la raison pour laquelle vous êtes autorisé à avoir une valeur d'énorme et une classe avec le même nom: les deux noms ne sont pas entrés en collision.

En classe Bad, les règles de recherche d'identifiant trouveront la classe mauvaise avant trouve l'énum, ​​et donc l'erreur. Maintenant, si vous qualifiez pleinement l'identifiant, la recherche de noms vérifiera d'abord la portée de l'identifiant global et correspond à la valeur Enum. À l'extrémité opposée, vous devrez ajouter le mot-clé ou ou ou ou pour déclarer des variables de type mauvais. xxx

Maintenant, je conseillerais contre cette utilisation. Ce n'est généralement pas une bonne idée de réutiliser un identifiant comme celui-ci. Le code sera plus complexe et probablement trompeur pour le lecteur occasionnel (le même identifiant non qualifié fait référence à différentes choses lorsqu'il est utilisé dans différents contextes). Si les noms doivent être mauvais , envisagez d'utiliser un espace de noms ou une classe enfermé pour la classe ou l'énum (préférez-le là-bas).


0 commentaires