2009-03-08 5 views

Répondre

32

Vous êtes proche, vous pouvez transférer déclarer la classe dans l'espace, puis le définir en dehors si vous voulez:

namespace ns { 
    class A; // just tell the compiler to expect a class def 
} 

class ns::A { 
    // define here 
}; 

Ce que vous ne pouvez pas faire est de définir la classe dans l'espace de noms sans membres et définir la classe à nouveau en dehors de l'espace de noms. Cela viole la règle de définition unique (ou un non-sens).

+0

merci. ce n'est pas plus succinct mais cela semble logique. –

+1

Je ne pense pas qu'il existe vraiment une version plus succincte ou plus lisible que 'namespace ns {class A {}; } 'mais c'est probablement juste une opinion personnelle. –

+0

C'est la séparation de la déclaration et de la définition. – Shaowu

0

Non, vous ne pouvez pas. Pour citer le standard C++, section 3.3.5:

Un nom déclaré à l'extérieur tous nommés ou espaces de noms sans nom (7.3), les blocs (6.3), le plaisir (8.3.5), la fonction définitions (8.4) et classes (clause 9) a une portée espace de nommage global

Ainsi, la déclaration doit être à l'intérieur d'un bloc d'espace de nom - la définition peut bien sûr être à l'extérieur.

+0

, classe A {}; est une définition, pas une déclaration. Êtes-vous sûr que la citation est applicable, alors? –

+0

définitions sont des déclarations –

+0

um qui n'a pas été bien pensé - mais je suis sûr que la citation s'applique - je vais jeter un autre coup d'oeil. –

2

La section vous devriez lire ceci:

7.3.1.2 Définitions membres Namespace

3 Chaque nom d'abord déclaré dans un espace de noms est membre de cet espace de noms [.... ]

Notez le terme - déclaration pour que D.Shawley (et son exemple) soit correct.

7

Vous pouvez le faire, mais ce n'est pas vraiment plus succint.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

Ou

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
}; 
bien
Questions connexes