2008-10-05 17 views
27

Al crear una biblioteca en un espacio de nombre 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 ya sea en espacio de nombres de la biblioteca:Espacios de nombres y sobrecarga del operador en C++

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&); 

De mis pruebas, ambos parecen funcionar bien. ¿Hay alguna diferencia práctica entre estas dos opciones? ¿Es mejor el enfoque?

Respuesta

29

Debe definirlos en el espacio de nombres de la biblioteca. El compilador los encontrará de todos modos a través de la búsqueda dependiente de argumentos.

No hay necesidad de contaminar el espacio de nombres global.

+4

Otra razón para usar el espacio de nombres de la biblioteca: [esta publicación] (http://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution) contiene un ejemplo donde el uso del espacio de nombres global no funciona. – Tim

2

Debe definirlo en el espacio de nombres, ya que 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 cuestión discutible:

namespace Lib { 

class A { 
public: 
    A operator+(const A&); 
}; 

} // namespace Lib 
+1

Esto puede ser una mala idea, ya que significa que si B puede convertirse implícitamente en A pero no es una subclase de A, B entonces A + B funciona, pero B + A no lo hace confusamente. Por supuesto, eso no necesariamente importa, por ejemplo, si el estilo de su casa prohíbe la conversión implícita entre los tipos definidos por el usuario de todos modos. –

+1

Acepto: Existe el problema de que A + B funciona, pero no B + A (por ejemplo, A es una clase que simula un número complejo y B an int). Otro problema es que un operador no amigo + funciones aumenta la encapsulación de la clase, mientras que el método de clase lo disminuye. – paercebal

15

Ponerlo en el espacio de nombres biblioteca funciona gracias a las Koenig lookup.

+1

De hecho, la búsqueda de Koeing se creó exactamente para poder poner la función dentro del espacio de nombre Lib y aún así tener una sobrecarga correlativa. Ver Artículos excepcionales en C++ 31-32. – tenpn