tags:

views:

265

answers:

6

I've been told it's bad to have "using namespace ns123" in a header file, but I can't remember what the reason given was. Is it in fact a bad thing to do, and why?

+1  A: 

It will often give you strange and mysterious compilation errors, for one thing, where you can spend hours trying to figure out the root of the problem.

Péter Török
A: 

Here's a good explanation - "Migrating to Namespaces" by Mr. Sutter.

Nikolai N Fetissov
+3  A: 

Pulling all the classes and functions out of their namespace is generally a bad idea and is actually opposed to concept of having namespaces...it is usually better to use 'using' on a specific class or function.

Stephen Cross
It's not as bad in a .cpp file, though, since you're ignoring namespaces in a local area. In an .h file, you're ignoring namespaces in a large and not well-defined area.
David Thornley
+15  A: 

It's a bad practice, in general, because it defeats the purpose of namespaces. By defining in a header you're not enforcing strict control over the scope of the using declaration, meaning that you can run into name clashes in unexpected places.

Dan Olson
+8  A: 

If you put a using declaration in a header file, anything that #includes the header file also has the namespace imported, whether they want it or not. This violates the principle of least surprise and defeats the purpose of namespaces by allowing changing an #include statement to easily cause a naming collision. If you want to import a namespace in your own .cpp file to save a little typing and produce more readable code, that's fine. Just don't force users of your module to do the same.

dsimcha
`using namespace N;` is a using directive, not a using declaration. A using declaration may be appropriate, as it only affects the specified name instead of anything and everything in N, if that is what is desired. (`using N::name;` is an example using declaration.)
Roger Pate
A: 

Ordinary C++ Programming

Yes there are often places where this makes sense, and you have control over where and how you use your using stamenets. If this is a program with a limited scope you do not need to worry about place usings in global scope.

For monolithic applications I would strongly recommend not placing usings in a very busy namespace -- as collisions will drive you mad once you are committed. For example:

  1. ::
  2. ::companyname
  3. ::companyname::component
  4. ::companyname::component::sub-component.

I would say that it is perfectly acceptable to start place using statements at level 3 or 4 -- thats where the chances of collisions start becoming very low.

Generic / TMP Programming

In generic programming and TMP using is often used to configure your libraries for a specific domain and this is often done through using statements.

Hassan Syed