2010-07-19 8 views
13

j'étais un peu surpris d'apprendre que je ne pouvais pas déclarer avant une classe d'un autre champ en utilisant l'opérateur de résolution de portée, à savoirForward déclarant des classes dans les espaces de noms

class someScope::someClass; 

Au lieu de cela, la déclaration complète doit être utilisée comme suit:

namespace 
{ 
    class someClass; 
} 

Quelqu'un peut-il expliquer pourquoi c'est le cas?

MISE À JOUR: Pour clarifier les choses, je demande pourquoi c'est le cas.

+0

double: http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace réponse technique, de cette question : http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace/1368738#1368738 – GManNickG

Répondre

6

semble que la réponse réside dans la spécification C++:

3.3.5 "champ d'espace de noms" dans la norme.

entités déclarées dans un espace de noms corps sont dits être des membres de l'espace de noms , et les noms introduits par ces déclarations dans la région déclarative de l'espace de noms sont dits noms de membres de l'espace de noms .

Un membre d'espace de nom peut également être appelé après la :: portée opérateur de résolution (5.1) appliquée à le nom de son espace de noms ou le nom d'un espace de noms qui désigne l'espace de noms du membre dans un using- directif;

1

Je ne sais pas pourquoi. Peut-être parce que, dans votre premier extrait de code, someScope est non déclaré. Il peut s'agir d'un espace de noms ou d'un nom de classe. Si someScope est un nom de classe, vous ne pouvez pas renvoyer de manière indépendante un membre de classe d'une autre classe.

8

Vous ne pouvez pas déclarer une classe en dehors de son espace de noms, car le compilateur ne pouvait pas connaître le type someScope.

espace de noms {} est tenu de déclarer l'existence d'un espace de noms, puis, déclarer classe someClass dans votre champ.

+0

Vous ne répondez pas à ma question , Je demande pourquoi ce n'est pas le cas comment le contourner - je le sais déjà. :-) – Konrad

+1

À mon humble avis, cette décision a été choisie pour faire une distinction entre someClass :: someMember et someNamespace :: someClass. Comment pourrait le gérer autrement? – Doomsday

Questions connexes