2010-01-25 16 views
15

Je comprends les problèmes que vous pouvez rencontrer lorsque vous mettez une déclaration using dans un fichier d'en-tête, donc je ne veux pas faire ça. Au lieu de cela j'ai essayé de mettre le using (ou un namespace foo =) dans la déclaration de classe, pour réduire le typage répétitif dans le fichier d'en-tête. Malheureusement, j'ai des erreurs de compilation. On dirait que ce serait une fonctionnalité utile. Dans le code réel, les noms d'espace de noms sont beaucoup plus longs et ennuyeux et ce n'est pas quelque chose que je peux changer.Pourquoi ne puis-je pas mettre une déclaration "using" dans une déclaration de classe?

Quelqu'un peut-il expliquer pourquoi ce n'est pas légal, ou (mieux) s'il existe une solution de contournement?

Répondre

21

Pourriez-vous faire typedef gee::whiz::abc::def::Hello Hello?

+2

Cela polluera toujours l'espace de noms qui est ce qu'il essaie d'éviter. – Trent

+6

Non si elle est utilisée dans la déclaration de classe. –

+0

Ouais ça marche! Et si j'en fais un typedef privé alors un autre code ne peut pas l'utiliser accidentellement. – Dan

4

effectivement pas une idée totalement horrible. Cela fait au moins autant de sens que cela fonctionne maintenant (ce qui est accordé, ce n'est pas beaucoup). Je pense que le problème fondamental est que les classes ne sont pas l'unité de compilation et de liaison, mais des «unités de traduction». Mais faire classe par classe est beaucoup plus propre, avoir des classes en modules, comme Java ou C# ou d'autres langages qui ont plus de sens.

1

Avait le même problème, trouvé cette question. J'ai compris que si vous enveloppez struct foo avec un espace de noms anonyme, il semble que vous pouvez mettre

en utilisant l'espace de noms too :: many :: names;

en haut de l'emballage anonyme. C'est plutôt moche, cependant, en ajoutant plus de couches d'accolades imbriquées.

+0

Hmm ... mais alors vous avez un espace de noms anon dans un fichier d'en-tête. Je ne suis pas sûr de vouloir ouvrir cette boîte de Pandore: http://stackoverflow.com/questions/357404/anonynous-namespaces http://stackoverflow.com/questions/357564/uses-for-anonymous-namespaces-in-header- fichiers – Dan

+0

Je comprends que la conception des espaces de noms était l'un des regrets d'un précédent tour de normalisation, car il était entassé sans grande expérience de l'implémentation. J'ai principalement utilisé les librairies d'en-têtes Boost dernièrement, donc cela a semblé fonctionner correctement dans une expérience de cinq minutes. –

+0

http://www.drdobbs.com/184401782 –