2011-06-09 12 views
9

Tengo una buena comprensión de cómo funcionan la declaración y la directiva de C++' using '. Sin embargo, estoy perplejo en esto ... ¿Tal vez no sea posible? Quiero evitar tener que calidad de mi variables de enumeración:Espacio de nombres C++ 'using' declarativo para una clase 'enum

namespace Foo { 
    class MyClass { 
     public: 
     enum MyEnum { X, Y, Z }; 
    } 
} 

Y ahora, desde fuera de ese espacio de nombres, me gustaría ser capaz de hacer cosas como:

using Foo::MyClass.MyEnum; 
MyEnum letter = MyEnum::x; 

Pero al parecer eso no es el camino ¿para hacerlo? Apuesto a que esto es posible, pero mi notación es incorrecta ... También intenté usar Foo :: MyClass :: MyEnum, pero luego el compilador piensa que Foo :: MyClass es un espacio de nombres.

Agregado: Como se puede ver, se convierte en molesto tener que declarar completamente todo ...

Foo::MyClass::MyEnum value = Foo::MyClass::X; 
+0

¿Dónde intentas poner 'using'? Dentro de una clase, o? –

+0

posible duplicado de [using declaration with enum?] (Http://stackoverflow.com/questions/438192/using-declaration-with-enum) –

+0

@Kiril, dentro de un método que está en una clase diferente que NO está en el espacio de nombres Foo. – Jmoney38

Respuesta

1

C++ 03 no admite completamente los tipos de calificación enum, pero es una extensión de MSVC. C++ 0x hará este estándar, y creo que puede using y enum en C++ 0x. Sin embargo, en C++ 03, no creo que su problema pueda ser resuelto.

+0

Lo que dijo :) – ptpaterson

4

Esto no responde a su pregunta directamente, pero si quieres economizar pulsaciones de tecla que podría intentar usando un typedef en su lugar.

typedef Foo::MyClass::MyEnum MyClassEnum; 

Por cierto, parece que your question has been asked on Stack Overflow before. A partir de la respuesta a esa pregunta:

Una clase no define un espacio de nombres, por lo tanto, el "uso" no es aplicable aquí.

+0

Creo que debería reemplazar el punto ('.') con' :: 'aftert' MyClass' –

+0

@Kiril: Gracias por señalarlo. Supongo que eso es lo que obtengo por copiar y pegar. :) –

+0

Leí ese artículo antes de publicarlo, pero no parece abordar mi preocupación de que la clase está dentro de un espacio de nombres, Y un cliente fuera del espacio de nombres desea incluir esa enumeración específica. Entiendo que el enumerador no se incluirá automáticamente en el alcance local, está bien. – Jmoney38

1

Tengo lo siguiente para compilar, después de jugar mucho. Creo que será lo más cercano que puedas obtener sin typedef'ing.

namespace Foo { 
    class MyClass { 
     public: 
      enum MyEnum { X, Y, Z }; 
    }; 
}; 

namespace Foo2 { 
    using Foo::MyClass; 

    class AnotherClass { 
     public: 

      AnotherClass(){ 
       MyClass::MyEnum value = MyClass::X; 
      } 
    }; 
}; 

int main(){ 

    return 1; 
} 

También podría utilizar MyClass como clase base, pero dudo que sea algo que desee hacer.

namespace Foo2 { 
    using namespace Foo; 
    class AnotherClass : public MyClass{ 
     public: 
      AnotherClass(){ 
       MyEnum value = X; 
      } 
    }; 
}; 

Esto también tiene una buena información. namespaces for enum types - best practices

+0

Salté delante de mí y entendí mal lo que estabas buscando. – ptpaterson

+0

Gracias por la entrada. Sin embargo, como dijo, preferiría poder usar MyEnum sin el operador de alcance para MyClass.Puntos de esfuerzo :-) – Jmoney38

Cuestiones relacionadas