2010-08-28 13 views

risposta

33

è possibile combinare gli spazi dei nomi in una sola nominare e utilizzare il nuovo nome (es. Foobar).

namespace Foo { namespace Bar { 
    void some_func() { 
     printf("Hello World."); 
    } 
}} 

namespace Foobar = Foo::Bar; 

int main() 
{ 
    Foobar::some_func(); 
} 
+8

+1 per informazioni che non avrebbe potuto ottenere semplicemente chiedendo al suo compilatore. –

+1

un'altra funzionalità non necessaria e confusa. –

1

Hai provato? Visual C++ mi dà i seguenti errori:

1> C: \ ... \ foo.cpp (31): l'errore C2061: errore di sintassi: identificatore 'bar'
1> C: \ ... \ fooo.cpp (31): errore C2143: errore di sintassi: mancante ';' prima di '{'

+4

Nota: solo perché qualcosa funziona o non funziona con un particolare compilatore non significa che siano standard o non conformi agli standard. –

+1

@Billy: Qualcosa funziona non significa niente. Qualcosa * non * funziona. Se il tuo compilatore non supporta una funzione, non puoi usarla, a prescindere dallo standard che dice sull'argomento. –

+1

@Dennis: Mentre questo è vero, l'OP non ha chiesto se il suo compilatore lo supportasse o meno, (s) ha chiesto se fosse valido. –

4

No; è un errore di sintassi.

11

No, non lo è. Invece di un gruppo di namespace annidati frastagliate, è certamente valida per metterli sulla stessa linea:

namespace Foo { namespace Bar { namespace YetAnother { 
    // do something fancy 
} } } // end Foo::Bar::YetAnother namespace 

Aggiornamento:

You can now nest namespaces more cleanly in C++17:

namespace Foo::Bar::YetAnother { 
    // do something even fancier! 
} 
5

nomi qualificati, come something::someting_else in C++ può essere utilizzato solo per riferirsi a entità che sono già stati dichiarati in precedenza. Non è possibile utilizzare tali nomi per introdurre qualcosa precedentemente sconosciuto. Anche se lo spazio dei nomi annidato era già stato dichiarato in precedenza, l'estensione di tale spazio dei nomi viene anche considerata come "introduzione di qualcosa di nuovo", quindi il nome qualificato non è consentito.

È possibile utilizzare tali nomi per la definizione di funzioni precedentemente dichiarati nel namespace

namespace foo { 
    namespace bar { 
    int baz(); 
    } 
} 

// Define 
int foo::bar::baz() { 
    /* ... */ 
} 

ma non dichiarando nuovi spazi dei nomi di estendere quelle esistenti.

0

Come per la grammatica in $ 2,10, un identificatore non può avere il token ":". Quindi il nome foo::bar è mal formato.

+0

Ciò non significa molto, senza mostrare anche che qui è necessario un identificatore. 'foo :: bar' è ovviamente valido a volte. –