2012-07-25 7 views
20

Decir que tengo una clase como esta:importar clases anidadas al espacio de nombres - C++

class A { 
public: 
    class B { 
     // ... 
    }; 
    static void f(); 
    // ... 
}; 

que puede referirse a B como A::B y para f() como A::f(), pero puedo importar B y f() en el mundial/corriente espacio de nombres? Intenté

using A::B; 

pero eso me dio un error de compilación.

+4

¿El error de compilación fue "error: 'A' no es un espacio de nombres"? – Johnsyweb

+4

No puede hacer eso para 'A :: f()'. – iammilind

+1

@iammilind pero puede lograr ese comportamiento con una solución alternativa. –

Respuesta

16

Usted debe ser capaz de utilizar los alias de espacio de nombres para la clase:

using B = A::B; 

Sin embargo no se puede hacer eso con la función miembro, ni siquiera con métodos estáticos.

Editar: De acuerdo con esta this SO answer (What is the difference between 'typedef' and 'using' in C++11) debe ser válido, y de hecho crea un alias de tipo de la misma manera que lo hace typedef. Sin embargo, solo es C++ 11.


Hay una solución para las funciones miembro estáticas en C++ 11, declarando una variable apuntando a la función estática:

struct Foo 
{ 
    static void bar() 
     { } 
}; 

auto bar = Foo::bar; 

Editar: Por supuesto, tener una variable global que apunta a una función de miembro estático también es posible en el estándar anterior de C++, pero es más complicado que usar la palabra clave auto de C++ 11. En el ejemplo anterior, sería:

void (*bar)() = Foo::bar; 
+2

'' usando B = A :: B; '' esto no funcionará. Otro punto es que los punteros a las funciones no pueden ser insertados. –

+4

@SergeyK.Funciona bien para mí, con GCC 4.7.1. Pero tienes razón sobre la línea de entrada. –

+3

1.cpp: 9: 7: error: especificador de nombre anidado esperado antes de 'B' usando B = A :: B; '' (gcc.EXE (GCC) 4.8.0) '' –

8

Usted puede typedef

typedef A::B B; 
+5

También puede crear 'f()' en el espacio de nombres global que llama a 'A :: f()'. –

32

Hay dos soluciones para su problema:

1) Clase B:

typedef A::B B; 

2) La función f():

inline void f() 
{ 
    A::f(); 
} 

Pero piense dos veces antes de usarlos.

Editar: En C++ 11 se puede hacer auto f = A::f; pero esto en realidad crea un puntero a una función y funciones punteros no puede ser inline.

+0

Para las soluciones 'typedef'or' using', ¿alguna idea para que funcione incluso con clases privadas anidadas? – Dreamer

Cuestiones relacionadas