2010-08-28 9 views
15

Ist es legal, so etwas zu ersetzen:Mehrere Namespace-Deklaration in C++

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

mit etwas wie folgt aus:

namespace foo::bar { 
    baz(); 
} 

?

+1

was ist es, dass Sie dieses Ziel zu erreichen versuchen? – Chubsdad

+3

Dies funktioniert in C++ 17. –

Antwort

33

Sie Namespaces in eine kombinieren Benenne und verwende den neuen Namen (zB Foobar).

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

namespace Foobar = Foo::Bar; 

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

+1 für Informationen, die er nicht bekommen hätte, indem er nur seinen Compiler gefragt hätte. –

+1

eine weitere unnötige, verwirrende Funktionalität. –

1

Haben Sie es versucht? Visual C++ mir die folgenden Fehler gibt:

1> C: \ ... \ foo.cpp (31): Fehler C2061: Syntaxfehler: Bezeichner 'bar'
1> C: \ ... \ fooo.cpp (31): Fehler C2143: Syntaxfehler: fehlt ';' vor '{'

+4

Hinweis: Nur weil etwas mit einem bestimmten Compiler funktioniert oder nicht funktioniert, heißt das nicht, dass es standardkonform ist oder nicht. –

+1

@Billy: Etwas arbeiten bedeutet nichts. Etwas funktioniert nicht. Wenn Ihr Compiler kein Feature unterstützt, können Sie es nicht verwenden, unabhängig davon, was der Standard zum Thema sagt. –

+1

@Dennis: Während dies zutrifft, fragte das OP nicht, ob sein oder ihr Compiler es unterstützen würde, (s) er fragte, ob es gültig sei. –

4

Nein; Es ist ein Syntaxfehler.

11

Nein, ist es nicht. Statt einer Reihe von gegliederten verschachtelten Namensräumen, ist es sicherlich gültig sie auf der gleichen Linie zu setzen:

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

aktualisieren:

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

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

qualifizierte Namen, wie something::someting_else in C++ können nur dann verwendet werden, um Einheiten zu beziehen, die bereits vor erklärt wurden. Sie können solche Namen nicht verwenden, um etwas Unbekanntes einzuführen. Selbst wenn der verschachtelte Namespace bereits zuvor deklariert wurde, wird die Erweiterung dieses Namespace auch als "Einführung von etwas Neuem" betrachtet, sodass der qualifizierte Name nicht zulässig ist.

können Sie solche Namen verwenden für Funktionen, die zuvor erklärt im Namensraum

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

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

aber nicht erklärt, neue Namensräume der Erweiterung bestehender definieren.

0

Gemäß der Grammatik in 2,10 $ kann ein Bezeichner das Token ":" nicht haben. So ist der Name foo::bar schlecht gebildet.

+0

Das bedeutet nicht viel, ohne auch zu zeigen, dass hier ein Bezeichner benötigt wird. 'foo :: bar' ist offensichtlich manchmal gültig. –