2010-03-19 11 views
15

Si tengo algunos operadores ostream sobrecargados, definidos para objetos locales de biblioteca, ¿está bien que vayan al espacio de nombres estándar? Si no los declaro en el espacio de nombre estándar, entonces debo usar using ns:: operator <<.¿A qué espacio de nombres va el operador << (transmisión)?

Como una posible pregunta de seguimiento, ¿hay operadores que deberían ir al espacio de nombres estándar o global?

Respuesta

24

De acuerdo con Koenig Lookup (C++ Standard 3.4.2) operator<< se buscará en los espacios de nombres de los argumentos. No es necesario declararlo en el espacio de nombre std.

+0

Entonces, si tengo un objeto/clase de la biblioteca C externa en el espacio de nombres global, ¿debo declarar los operadores en el espacio de nombres global también? – Anycorn

+0

Creo que es una buena idea declarar operadores en el espacio de nombres donde está su argumento. –

2

En general, es una mala práctica declarar que algo (tipos, operadores, etc.) forma parte de un espacio de nombres que no le pertenece. Esto puede tener consecuencias inesperadas para las personas que consumen su biblioteca. Una mejor solución es definir su propio espacio de nombres e importar ambos std y su espacio de nombres cuando necesite combinar soluciones.

7

El estándar C++ explícitamente le prohíbe declarar sus propios constructos en el espacio de nombres estándar.

+1

std :: swap es una excepción notable. Se le permite específicamente proporcionar especialización de plantilla de std :: swap, que debe residir en el espacio de nombres estándar –

+5

'std :: swap' no es una excepción. Puede proporcionar especializaciones para cualquier plantilla de biblioteca estándar. –

21

operator<<(..., MyClass) debe ir en el mismo espacio de nombres como MyClass. Debería considerarlo como parte de la interfaz MyClass, aunque sea (necesariamente) una función que no es miembro.

Un par de referencias:

+0

La excepción a la regla de poner todas las cosas relacionadas en un espacio de nombre es la especialización parcial relacionada con MyClass, por ejemplo, para std :: hash, std :: less, std :: swap, etc. que entran en :: std ::. – metal

Cuestiones relacionadas