2014-01-07 10 views
6

Ich bin eine Klasse zu schreiben (in einer Header-Datei), die die folgende Methode erfordert:erklären nach vorne in verschachtelten Namespace

static const foo::bar::clz* getSomething(void); 

Da will ich nicht die Header-Datei mit einem #include verschmutzen ich wählen zu vorwärts erklärenclz:

namespace foo 
{ 
    namespace bar 
    { 
     class clz; 
    } 
} 

Aber das ist eher zu plump. Gibt es eine bessere Möglichkeit, dies in C++ 11 zu tun? Etwas nach dem Vorbild von

class foo::bar::clz; 

Es wäre schöner noch, wenn Sie nicht, ob oder nicht haben, um es vorwegzunehmen als class, struct oder union umgesetzt wird. Haben die C++ 11-Grammatiker das auch abgedeckt? (typename auto könnte ein Kandidat sein, aber ich bin kein Experte in C++ Grammatik).

Antwort

5

Die verschachtelten Namespaces können nicht vermieden werden.

Was class vs. struct vs. union, teilweise: class und struct können austauschbar verwendet werden. Wenn es ein union ist, muss es als solches deklariert werden.

+1

Aber Sie werden mit einer Warnung gewarnt, wenn Sie ein Objekt als "struct" weiterleiten und es als "Klasse" deklarieren. –

+0

@PaperBirdMaster True, Compiler warnen normalerweise davor. Trotzdem ist es legal und nicht (an sich) gefährlich. Die Warnung wird wahrscheinlich als "Sind Sie sicher, dass Sie sich auf das beziehen, was Sie denken, dass Sie sind?" Gerechtfertigt? Es ist einer der wenigen, die ich deaktivieren würde. – Angew

+1

Es kann gefährlich sein, aufgrund von Problemen, die nicht durch den Standard abgedeckt werden, wie Name Mangling ... zumindest auf MSVC struct und class werden anders gemangelt, so erhalten Sie Linker Fehler, wenn Sie die Vorwärtsdeklaration falsch bekommen –

Verwandte Themen