2009-03-08 9 views

Antwort

32

Sie sind in der Nähe, können Sie die Klasse im Namensraum deklarieren weiterleiten und es dann nach außen definieren, wenn Sie wollen:

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

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

Was Sie nicht tun können, die Klasse ist ohne Mitglieder im Namensraum zu definieren und dann definieren die Klasse wieder außerhalb des Namensraums. Das verstößt gegen die eine Definitionsregel (oder einen solchen Unsinn).

+0

danke. das ist nicht prägnanter, aber es scheint Sinn zu ergeben. –

+1

Ich glaube nicht, dass es wirklich eine prägnantere oder lesbarere Version gibt als 'namespace ns {class A {}; } Aber es ist wahrscheinlich nur persönliche Meinung. –

+0

Das ist die Trennung von Deklaration und Definition. – Shaowu

0

Nein, du kannst nicht. Um es mit dem C++ Standard Abschnitt 3.3.5:

Einen Namen außerhalb aller deklarierten Namen oder unbenannte Namensräume (7,3), Blöcke (6.3), Spaß (8.3.5), Funktion Definitionen (8.4) und Klassen (Klausel 9) globalen Namespace Umfang

So die Erklärung innerhalb eines Namespace-Block sein muss - die Definition natürlich außerhalb es sein kann.

+0

gut, Klasse A {}; ist eine Definition, keine Deklaration. Sind Sie sicher, dass das Angebot anwendbar ist? –

+0

Definitionen sind Deklarationen –

+0

um das war nicht gut durchdacht - aber ich bin prety sicher, dass das Zitat gilt - ich werde einen anderen Blick werfen. –

2

Der Abschnitt, den Sie lesen sollten, ist dies:

7.3.1.2 Namespace Mitglied Definitionen

3 Jeder Name zuerst in einem Namespace deklariert ist ein Mitglied dieser Namespace [.... ]

Beachten Sie den Begriff - Deklaration, so dass D. Shawley (und sein Beispiel) korrekt ist.

7

Sie können das tun, aber es ist nicht wirklich mehr Succint.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

Oder

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
};