Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why "using namespace X;" is not allowed inside class/struct level?

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.

like image 238
iammilind Avatar asked Jun 13 '11 04:06

iammilind


People also ask

Can namespace be declared inside structure?

Namespace definitions cannot appear inside functions; that is, they must appear outside functions at global scope.

Why we should not use using namespace std in C++?

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.

Why should you never place a using namespace directive inside of a header file?

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.

Is namespace a struct?

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.


2 Answers

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.     } } 
like image 133
Billy ONeal Avatar answered Nov 10 '22 10:11

Billy ONeal


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.

like image 34
Adam Rosenfield Avatar answered Nov 10 '22 10:11

Adam Rosenfield