algo que me ha estado molestando por un tiempo:¿Debería cada clase tener su propio espacio de nombres?
La visión actual es que los tipos deben mantenerse en un espacio de nombres que sólo contiene funciones que son parte de la interfaz que no sea miembro de la clase (ver C++ estándares de codificación Sutter y Alexandrescu o here) para evitar que ADL obtenga definiciones no relacionadas.
¿Esto implica que todas las clases deben tener un espacio de nombres propio? Si suponemos que una clase puede ser aumentada en el futuro mediante la adición de funciones no miembro, entonces nunca puede ser seguro poner dos tipos en el mismo espacio de nombres ya que cualquiera de ellos puede introducir funciones no miembro eso podría interferir con el otro.
La razón por la que pregunto es que los espacios de nombres se vuelven engorrosos para mí. Estoy escribiendo una biblioteca de solo cabecera y me encuentro usando nombres de clases como project :: component :: class_name :: class_name. Sus implementaciones llaman a las funciones auxiliares pero como estas no pueden estar en el mismo espacio de nombres, también tienen para ser totalmente calificadas.
Editar:
Varias respuestas han sugerido que los espacios de nombres de C++ son simplemente un mecanismo para evitar conflictos de nombres. Esto no es asi En C++, las funciones que toman un parámetro se resuelven utilizando Argument Dependent Lookup. Esto significa que cuando el compilador intenta encontrar una definición de función que coincida con el nombre de la función verá cada función en el mismo espacio de nombres como el tipo (s) de sus parámetros cuando encuentre candidatos.
Esto puede tener consecuencias no deseadas y desagradables como se detalla en A Modest Proposal: Fixing ADL. Los estados de la regla de Sutter y Alexandrescu nunca ponen una función en el mismo espacio de nombres que una clase a menos que se suponga que sea parte de la interfaz de esa clase. No veo cómo puedo obedecer esa regla a menos que esté dispuesto a dar a cada clase su propio espacio de nombres.
Más sugerencias muy bienvenidas!
"Sus implementaciones llaman a las funciones auxiliares [que] tienen que ser completamente calificadas" - puede poner una declaración o directiva 'using' dentro de un cuerpo de función, si eso ayuda en absoluto. –
Por el amor de todas las cosas sagradas, no aplique una proporción 1: 1 entre clases y espacios de nombres. Derrota todo el propósito de tener espacios de nombres, y lleva a un montón de trabajo adicional con los dedos. –
@James D: No estoy de acuerdo. Creo que no va lo suficientemente lejos. También debemos asegurarnos de que cada espacio de nombre esté en un espacio de nombre. –