Espacios de nombres y sobrecarga de operadores en C ++
-
05-07-2019 - |
Pregunta
Cuando se crea una biblioteca en un espacio de nombres en particular, a menudo es conveniente proporcionar operadores sobrecargados para las clases en ese espacio de nombres. Parece (al menos con g ++) que los operadores sobrecargados pueden implementarse en el espacio de nombres de la biblioteca:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
o el espacio de nombres global
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
Desde mi prueba, ambos parecen funcionar bien. ¿Hay alguna diferencia práctica entre estas dos opciones? ¿Alguno de los enfoques es mejor?
Solución
Deberías definirlos en el espacio de nombres de la biblioteca. El compilador los encontrará de todos modos mediante una búsqueda dependiente de argumentos.
No es necesario contaminar el espacio de nombres global.
Otros consejos
Ponerlo en el espacio de nombres de la biblioteca funciona debido a búsqueda de Koenig .
Debería definirlo en el espacio de nombres, porque la sintaxis será menos detallada y no saturará el espacio de nombres global.
En realidad, si define sus sobrecargas en su definición de clase, esto se convierte en una pregunta discutible:
namespace Lib {
class A {
public:
A operator+(const A&);
};
} // namespace Lib