He redefinido algunas funciones matemáticas (para que sean más rápidas, es decir, menos precisas, o use plantillas). Puse estas funciones en un espacio de nombres y funcionan muy bien.C++: ocultar algunas funciones
Sucede a menudo, sin embargo, que me olvide de llamar a las funciones de mi espacio de nombres (es decir: me olvide de escribir mymath::cos
o using mymath::cos;
cuando quiero llamar cos
), y es bastante difícil de averiguar dónde se me olvidó (hasta ahora lo descubrí solo mediante perfiles).
Dado que
- sóloincluyen estándar
math.h
ocmath
encabezados dentro de mi cabecera matemáticas, y que - necesito incluir cabeceras de matemáticas estándar (porque algunos de mis funciones son sólo envoltorios para el estándar uno, y yo quiero que sean en línea o que están en plantilla),
hay una manera portátil para ocultar función matemática estándar para que se informe de un error de compilación, si se utilizan las funciones matemáticas del espacio de nombres global (es decir: sin un espacio de nombres)?
Una solución podría estar poniendo un using namespace mymath;
en la parte inferior de mi archivo de encabezado matemático, pero esta solución no parece tan buena: rompe el propósito de los espacios de nombres; Prefiero tener que explicar explícitamente si debo usar una función de mymath
o de std
, de modo que me veo obligado a elegir entre una función más fina o más precisa sin el riesgo de olvidarme de ella.
EDITAR:
Muchas de las respuestas dicen que si uso cos
del espacio de nombres global (sin utilizar ni std
mymath
), e incluyen cmath
(y no math.h
), compilación fallara.
No sé lo que la norma dice al respecto, pero:
#include <cmath>
int main() {
cos(M_PI);
return 0;
}
compila bien con GNU GCC (g++
) 4.5.1 (y versiones anteriores).
Tiene razón con respecto al EDIT: "No se especifica si estos nombres se declaran por primera vez dentro del ámbito del espacio de nombres global y luego se inyectan en el espacio de nombres std mediante declaraciones de uso explícitas". – ybungalobill