Cette question m'a amené à me demander s'il est jamais utile / nécessaire de qualifier pleinement les noms de classe (y compris l'opérateur de portée globale) dans une définition de fonction membre hors classe.
D'une part, je n'ai jamais vu cela se faire auparavant (et la syntaxe pour le faire correctement semble obscure). De l'autre, la recherche de nom C ++ est très simple, donc peut-être un cas de coin existe.
Question:
Y a-t-il jamais un cas où l'introduction d'une définition de fonction membre hors classe
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
différerait de
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(pas de ::
préfixe de portée globale )?
Notez que les définitions de fonctions membres doivent être placées dans un espace de noms contenant la classe, ce n'est donc pas un exemple valide.
Réponses:
Une directive d'utilisation peut
Fully
être ambiguë sans qualification.la source
C'est nécessaire si on est masochiste et qu'on aime écrire des trucs comme ça
On peut bien sûr écrire la deuxième surcharge comme
foo::foo::bar::baz
de portée globale, mais la question était de savoir si les deux déclarations peuvent avoir un sens différent. Je ne recommanderais pas d'écrire un tel code.la source
using
. C'est bien d'avoir différents cas mis en évidence!Si une directive using est utilisée, il peut y avoir un code déroutant.
Considérez le programme démonstratif suivant
Donc, pour plus de lisibilité, ce nom qualifié
montre précisément où la fonction est déclarée.
la source