2014-01-07 76 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上,結構和類會發生不同的變形,所以如果你發現前向聲明錯誤,你會得到鏈接錯誤 –