conocer este post útil en otra parte:
espacios de nombres se separan y organizan funcionalidad. Puede tener una función xander333::sort()
y no entrará en conflicto con std::sort()
o boost::sort()
o cualquier otro tipo(). Sin espacios de nombres, solo puede haber un sort()
.
Ahora digamos que has puesto "using namespace std;" en todos sus archivos de origen y ha implementado una función de plantilla simple llamada fill()
en el espacio de nombres global de uno de sus archivos. Este archivo también depende de un encabezado de libFoo - foo.hpp
. La versión 2.1 de libFoo sale y, de repente, su programa ya no se compila. ¡Tu versión de fill()
de repente entra en conflicto con otra fill()
! ¿Que pasó?
Resulta que la gente ejecución libtal incluidas en la nueva versión de foo.hpp
cuando no lo hicieron antes. Ahora tiene todos los algoritmos estándar incluidos en su archivo fuente, y su using namespace std;
los ha arrastrado a todos al espacio de nombres global. std::fill()
ahora entra directamente en conflicto con su fill()
.
Más insidioso, ha obtenido su código para compilar al cambiar el nombre de su fill()
a , pero algo no está funcionando bien - sus números de informe están apagados. Resulta que su función personalizada divides()
, que hace matemáticas de precisión fija, ya no se llama porque la función de plantilla de (también recientemente incluida por foo.hpp
) hace una mejor coincidencia porque los tipos de llamada no coinciden exactamente con los tipos declarados .
de rosca con la discusión es relevante aquí:
http://www.cplusplus.com/forum/unices/27805/
'using namespace std' es un error de sintaxis en' C'. Pero 'using',' namespace', y 'std' en sí mismos son identificadores perfectamente legales (aunque desagradables) que puedes usar en tu código. – pmg
@pmg ¿Nadie mencionó nada sobre C? – meagar
Usar "me gusta" en una oración como esa es malo ... –