class C { using namespace std; // error }; namespace N { using namespace std; // ok } int main () { using namespace std; // ok }
I want to know the motivation behind it.
Namespace definitions cannot appear inside functions; that is, they must appear outside functions at global scope.
While this practice is okay for example code, pulling in the entire std namespace into the global namespace is not good as it defeats the purpose of namespaces and can lead to name collisions. This situation is called namespace pollution.
However you'll virtually never see a using directive in a header file (at least not outside of scope). The reason is that using directive eliminate the protection of that particular namespace, and the effect last until the end of current compilation unit.
First things first, namespace and struct are completely different beasts: they have different syntax and different semantics. The obvious: a struct introduces a type, you can use as templates argument. a namespace can be spread in several files.
I don't know exactly, but my guess is that allowing this at class scope could cause confusion:
namespace Hello { typedef int World; } class Blah { using namespace Hello; public: World DoSomething(); } //Should this be just World or Hello::World ? World Blah::DoSomething() { //Is the using namespace valid in here? }
Since there is no obvious way of doing this, the standard just says you can't.
Now, the reason this is less confusing when we're talking namespace scopes:
namespace Hello { typedef int World; } namespace Other { using namespace Hello; World DoSomething(); } //We are outside of any namespace, so we have to fully qualify everything. Therefore either of these are correct: //Hello was imported into Other, so everything that was in Hello is also in Other. Therefore this is okay: Other::World Other::DoSomething() { //We're outside of a namespace; obviously the using namespace doesn't apply here. //EDIT: Apparently I was wrong about that... see comments. } //The original type was Hello::World, so this is okay too. Hello::World Other::DoSomething() { //Ditto } namespace Other { //namespace Hello has been imported into Other, and we are inside Other, so therefore we never need to qualify anything from Hello. //Therefore this is unambiguiously right World DoSomething() { //We're inside the namespace, obviously the using namespace does apply here. } }
Because the C++ standard explicitly forbids it. From C++03 §7.3.4 [namespace.udir]:
using-directive: using namespace ::optnested-name-specifieroptnamespace-name ;
A using-directive shall not appear in class scope, but may appear in namespace scope or in block scope. [Note: when looking up a namespace-name in a using-directive, only namespace names are considered, see 3.4.6. ]
Why does the C++ standard forbid it? I don't know, ask a member of the ISO committee that approved the language standard.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With