2014-01-07 79 views
6

我正在写一个类(在头文件),需要下面的方法:正向声明中嵌套命名空间

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

因为我不想污染与#include我选择的头文件向前声明clz

namespace foo 
{ 
    namespace bar 
    { 
     class clz; 
    } 
} 

但是,这是相当笨拙了。在C++ 11中有这样一个可行的方法吗?沿

class foo::bar::clz; 

东西线仍,如果你没有预见到它是否作为一个classstructunion实现的还要好。 C++ 11语法学家是否也覆盖了那个? (typename auto可能是一个候选人,但我不是C++语法的专家)。

回答

5

无法避免嵌套命名空间。

至于classstructunion,部分:classstruct可以互换使用。如果是union,则必须这样声明。

+1

但是,当您向前声明一个对象为'struct'并在之后声明它为'class'时,您会受到警告。 –

+0

@PaperBirdMaster诚然,编译器通常会对此提出警告。尽管如此,这是合法的,而不是(本身)是危险的。这个警告可能是合理的,因为“你确定你指的是你认为的你?”这是我愿意禁用的少数人之一。 – Angew

+1

由于标准没有涉及到的问题,比如名称变形,至少在MSVC上,结构和类会发生不同的变形,所以如果你发现前向声明错误,你会得到链接错误 –