2010-01-25 8 views
15

Entiendo los problemas que puede tener cuando pone una declaración using dentro de un archivo de encabezado, por lo que no quiero hacer eso. En cambio, traté de poner el using (o un namespace foo =) dentro de la declaración de clase, para reducir el tipado repetitivo dentro del archivo de encabezado. Lamentablemente, recibo errores de compilación. Parece que sería una característica útil.¿Por qué no puedo poner una declaración de "uso" dentro de una declaración de clase?

#ifndef FOO_H 
#define FOO_H 

// This include defines types in namespace gee::whiz::abc::def, 
// such as the class Hello. 
#include "file_from_another_namespace.h" 

// using namespace gee::whiz::abc::def; // BAD! 

namespace x { 
    namespace y { 
     namespace z { 

struct Foo { 
    using namespace gee::whiz::abc::def; // Illegal. 
    namespace other = gee::whiz::abc::def; // Illegal. 

    // Foo(gee::whiz::abc::def::Hello &hello); // annoyingly long-winded 

    Foo(other::Hello &hello); // better 
    //... 
}; 

} } } // end x::y::z namespace 

#endif // FOO_H 

En el código real, los nombres de espacios de nombres son mucho más largo y molesto y no es algo que pueda cambiar.

¿Alguien puede explicar por qué esto no es legal o (mejor) si hay una solución alternativa?

Respuesta

21

¿Podría hacer typedef gee::whiz::abc::def::Hello Hello?

+2

Esto todavía contaminará el espacio de nombres, que es lo que está tratando de evitar. – Trent

+6

No si se usa dentro de la declaración de clase. –

+0

Sí, eso funciona! Y si lo hago un typedef privado, entonces otro código no puede usarlo accidentalmente. – Dan

4

en realidad no es una idea totalmente horrible. Tiene tanto sentido como la forma en que funciona ahora (que concedió, no es mucho). Creo que el problema básico es que las clases no son la unidad de compilación y enlace, sino "unidades de traducción". Pero hacerlo clase por clase es mucho más limpio, tener clases de módulos, como Java o C# u otros lenguajes que tengan más sentido.

1

Tuve el mismo problema, encontré esta pregunta. Me di cuenta de que si ajusta struct foo con un espacio de nombres anónimo, parece que puede poner

usando namespace too :: many :: names;

en la parte superior del contenedor anónimo. Sin embargo, es algo feo, al agregar más capas de llaves anidadas.

+0

Hmm ... pero luego tiene un espacio de nombres anónimo en un archivo de encabezado. No estoy seguro de querer abrir esa lata de gusanos: http://stackoverflow.com/questions/357404/anonynous-namespaces http://stackoverflow.com/questions/357564/uses-for-anonymous-namespaces-in-header- archivos – Dan

+0

Entiendo que el diseño de los espacios de nombres fue uno de los arrepentimientos de una ronda de estandarización anterior, ya que estaba repleto sin mucha experiencia de implementación. Últimamente he usado bibliotecas de encabezados de Boost, así que esto parece funcionar bien en un experimento de cinco minutos. –

+0

http://www.drdobbs.com/184401782 –

Cuestiones relacionadas