2009-10-08 14 views
10

tengo que usar una API proporcionada por un DLL con un encabezado como esto¿Utiliza una clase en un espacio de nombres con el mismo nombre?

namespace ALongNameToType { 
    class ALongNameToType { 
     static void Foo(); 
    } 
} 

¿Hay una manera de utilizar ALongNameToType :: :: ALongNameToType Foo sin tener que escribir ALongNameToType :: ALongNameToType cada vez? Intenté usar using namespace ALongNameToType, pero obtuve errores de símbolos ambiguos en Visual Studio. Cambiar el nombre del espacio de nombres o eliminarlo me da errores de enlazador.

+0

duplicado Posible [de clases y espacios de nombres que comparten el mismo nombre en C++] (http://stackoverflow.com/questions/4070915/classes-and-namespaces -sharing-the-same-name-in-c) – jww

Respuesta

20

No sé lo que es ambiguo, pero puede evitar todos los conflictos con otras funciones de Foo como esta:

namespace ALongNameToType { 
    struct ALongNameToType { 
     static void Foo(); 
    }; 
} 

typedef ALongNameToType::ALongNameToType Shortname; 

int main() { 
    Shortname::Foo(); 
} 
+0

Olvidé typedef totalmente ... +1 – AraK

+0

En realidad, no tienes que usar struct en lugar de clas s, ¿verdad? – 2am

+2

@ 2am: no es necesario, puede escribir 'class ALongNameToType {public: static void Foo(); }; 'si lo prefieres, pero el código de la pregunta debe solucionarse de una forma u otra. Generalmente uso 'struct' para tipos sin miembros no públicos. Debería establecer las condiciones para usar 'struct' en cualquier guía de estilo que se aplique al código. Algunas personas usan 'struct' específicamente para tipos de POD, o específicamente para tipos cuya definición se compilará como C, o específicamente para tipos sin constructores definidos por el usuario o funciones de miembros, o simplemente lo usan al azar para tipos que consideran" simples ";) –

3
namespace myns = ALongNameToType; 

Parece que no se puede asignar un alias a un ámbito de clase así:

// second ALongNameToType is a class 
namespace myns = ALongNameToType::ALongNameToType; 

Tal vez podría ser alias de la función de auto que:

namespace foo 
{ 
class foo 
{ 
public: 
    static void fun() 
    { 

    } 
}; 
} 

int main() 
{ 
void (*myfunc)() = foo::foo::fun; 

myfunc(); 
} 
3
using ALongNameToType::ALongNameToType::Foo; 

si solo quiere usarlo como Foo().

+0

Funciona para mí en gcc4. – Bill

+3

Lamentablemente no funciona para mí en Visual Studio 2008 'error C2885: 'ALongNameToType :: ALongNameToType :: Foo': no ​​es una declaración válida de uso en el alcance no de clase' – Steven

1

Hay tres formas de usar using. Una es para un espacio de nombres completo, una para cosas particulares en un espacio de nombres, y una para una clase derivada que dice que no quiere ocultar algo declarado/definido en una clase base. Puede usar el segundo de los:

using ALongNameToType::ALongNameToType 

Desafortunadamente esto no está trabajando para usted (debido a la ambigüedad del espacio de nombres y la clase con el mismo nombre). La combinación de este tipo de uso con una respuesta anterior debe deshacerse de la ambigüedad:

namespace alntt = ALongNameToType; 
using alntt::ALongNameToType; 

Pero una vez que haya cambiado el nombre del espacio de nombres, que realmente no necesita la declaración using (siempre y cuando usted es cómodo escribiendo el (abreviado) de espacio de nombres cada vez que utilice la clase:

namespace alntt = ALongNameToType; 
alntt::ALongNameToType a; 
... 
+0

Esto me da el' error C2874: using- declaración provoca una declaración múltiple de 'ALongNameToType :: ALongNameToType'' en Visual Studio 2008 – Steven

+0

Oh, bueno, es útil en casos donde no hay ambigüedad (por ejemplo, "using std :: cout"). –

Cuestiones relacionadas