Definieren einer Klasse in einem Namespace
-
05-07-2019 - |
Frage
Gibt es eine prägnante Art und Weise eine Klasse in einem Namespace als das zu definieren:
namespace ns { class A {}; }
Ich habe gehofft, so etwas wie class ns::A {};
funktionieren würde, aber leider nicht.
Lösung
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 können, ist die Klasse im Namensraum ohne Mitglieder definieren und dann die Klasse definiert wieder außerhalb des Namespace. Das verstößt gegen die One Definition Rule (oder Unsinn etc. zu jagen).
Andere Tipps
Sie können das tun, aber es ist nicht wirklich prägnanter.
namespace ns {
class A;
}
class ns::A {
};
oder
namespace ns {
class B;
}
using ns::B;
class B {
};
Der Abschnitt, den Sie lesen sollen, 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 Ausdruck - Erklärung so D.Shawley (und sein Beispiel) korrekt ist.
Nein kann man nicht. Um es mit dem C ++ Standard Abschnitt 3.3.5:
Ein Name erklärt außerhalb aller Namen oder unnamed Namensräumen (7,3), die Blöcke (6.3), Spaß (8.3.5), Funktion Definitionen (8.4) und Klassen (Klausel 9) globalen Namensraum Anwendungsbereich
So die Erklärung innerhalb eines Namespace-Block sein muss -. Die Definition kann natürlich außerhalb sein