Ich halte für besser geeignet, um den gesamten Code, der im Namespace in einem namespace a { ... }
-Block sein soll, zu umgeben semantisch was Sie tun: Sie definieren Elemente innerhalb des a
Namensraums. Aber wenn Sie nur Mitglieder definieren, dann werden beide Dinge funktionieren.
Wenn der Compiler void my::foo()
findet, wird es versuchen zu bestimmen, was my
ist, und es wird die using a::my
, lösen my
aus, dass und verstehen, dass Sie definieren die a::my::foo
Methode zu finden.
Auf der anderen Seite dieser Ansatz wird scheitern, wenn Sie freie Funktionen verwenden:
// header
namespace a {
class my { // ...
};
std::ostream & operator<<(std::ostream& o, my const & m);
}
// cpp
using a::my;
using std;
ostream & operator<<(ostream & o, my const & m) {
//....
}
Der Compiler wird den obigen Code in ein Programm glücklich übersetzen, aber was es wirklich tut, ist std::ostream& a::operator<<(std::ostream&, a::my const &)
im Header erklärt Datei - ohne Implementierung - und definieren std::ostream& ::operator<<(std::ostream &, a::my const &)
in der cpp-Datei, die eine andere Funktion ist. Mit Koening Lookup, wann immer der Compiler cout << obj
mit obj
vom Typ sieht a::my
, wird der Compiler sucht in dem einschließenden Namespaces von cout
und my
(std
und a
) und wird feststellen, dass es eine a::operator<<
deklarierte, aber nie in namespace a
definiert. Es wird Ihren Code kompilieren, aber nicht verknüpfen.
+1. Was sich im Namespace befindet, befindet sich im 'Namespace {}'. Dinge wie diese verlangen keine Einrückung, so dass es wirklich keinen Ärger gibt. – Potatoswatter