2012-07-25 14 views
20

Dire che ho una classe come questa:classi Importa annidate nel namespace - C++

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

posso fare riferimento a B come A::B e f() come A::f(), ma può importare B e f() in/corrente globale namespace? Ho provato

using A::B; 

ma che mi ha dato un errore di compilazione.

+4

Errore di compilazione "Errore: 'A' non è uno spazio dei nomi"? – Johnsyweb

+4

Non è possibile farlo per 'A :: f()'. – iammilind

+1

@iammilind ma puoi ottenere quel comportamento con una soluzione alternativa. –

risposta

16

Si dovrebbe essere in grado di utilizzare gli alias dello spazio dei nomi per la classe:

using B = A::B; 

Tuttavia non è possibile farlo con la funzione di membro, nemmeno con funzioni membro statiche.

Edit: Secondo this SO answer (What is the difference between 'typedef' and 'using' in C++11) questo dovrebbe essere valido, e in realtà crea un tipo alias nello stesso modo in cui typedef fa. Tuttavia, è solo C++ 11.


C'è una soluzione per le funzioni membro statiche in C++ 11, dichiarando una variabile che punta alla funzione statica:

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

auto bar = Foo::bar; 

Edit: Naturalmente, avendo una punta variabile globale a una funzione membro statica è possibile anche nel vecchio standard C++, ma è più complicato rispetto all'utilizzo della parola chiave auto di C++ 11. Nell'esempio sopra sarebbe:

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

'' usando B = A :: B; '' questo non funzionerà. Un altro punto è che i puntatori di funzione non possono essere sottolineati. –

+4

@SergeyK.Funziona bene per me, con GCC 4.7.1. Ma hai ragione riguardo l'inlining. –

+3

1.cpp: 9: 7: errore: identificatore nome nidificato atteso prima di 'B' utilizzando B = A :: B; '' (gcc.EXE (GCC) 4.8.0) '' –

8

Puoi typedef

typedef A::B B; 
+5

Si potrebbe anche creare 'f()' nel namespace globale che chiama 'A :: f()'. –

32

Qui ci sono due soluzioni per il vostro problema:

1) Classe B:

typedef A::B B; 

2) funzione f():

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

Ma pensaci due volte prima di usarli.

Modifica: In C++ 11 è possibile eseguire auto f = A::f; ma in realtà questo crea un puntatore a una funzione e i puntatori a funzioni non possono essere sottolineati.

+0

Per le soluzioni 'typedef'or' using', qualche idea per farlo funzionare anche con classi private annidate? – Dreamer