Search code examples
c++namespacesusinglanguage-lawyer

Why is "using namespace X;" not allowed at 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.


Solution

  • 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.
        }
    }