Los espacios de nombres en C++ se crearon con la idea de catalogar el código. Es una forma práctica de agrupar el código.
Otra ventaja de usar los espacios de nombre es que puedes tener elementos que se llamen igual pero con usos distintos cada uno en un espacio de nombres distinto y el programa funcionará perfectamente:
Código C++:
Ver originalnamespace a
{
int var = 0;
}
namespace b
{
int var = 0;
}
int main()
{
a::var=5;
std::cout << a::var << b::var;
}
El código que no se encuentra dentro de un espacio de nombres explícito se ubica en lo que podríamos denominar espacio de nombres base. De hecho podemos hacer lo siguiente:
Código C++:
Ver originalnamespace a
{
int var = 1;
}
namespace b
{
int var = 2;
}
int var=3;
int main()
{
int var = 4;
std::cout << a::var << b::var << ::var << var;
}
Cuando se usa "using namespace" se está importando el espacio de nombres al completo. Eso hace que pierdas el control sobre lo que t e estás trayendo. Si hay variables, clases o funciones que se solapan, cual es la que va a usar el compilador?? Lo mismo no es la que tú esperas:
Código C++:
Ver originalnamespace a
{
int var = 0;
}
namespace b
{
int var = 0;
}
using namespace a;
using namespace b;
int main()
{
var=5; // cual estamos rocando a::var o b::var??
std::cout << a::var << b::var;
}
Y el problema se agrava cuando la importación la declaramos en una cabecera ya que ahí estamos forzando a que todo aquel que use la cabecera tenga que importar el ese espacio de nombres. Con eso solo conseguimos crear confusión.
Si en un momento dado lo creemos conveniente podemos importar elementos concretos, lo que evita arrastrar todo el espacio de nombres:
Código C++:
Ver originalusing std::cout;
int main()
{
int var;
cin >> var; // error
std::cin >> var; // ok
cout << var; // ok
}
El mensaje lo he escrito desde el móvil y el código no está probado. Lo aviso por si acaso.
Un saludo.