2016-01-23 144 views
8

我有以下代碼的公共成員:C++:私人嵌套類型

class Base 
{ 
    private: 
    class NestedBase 
    { 
     public: 
     void Do() {} 
    }; 

    public: 
    NestedBase nested; 
}; 

int main() 
{ 
    Base b; 
    b.nested.Do(); // line A compiles 
    Base::NestedBase instance; // line B doesn't compile 
} 

NestedBase類是一個私有嵌套類Base,如此看來自然的線B不編譯。但是,在另一方面,可變b具有公共部件nested,我可以從外面Base調用其方法Do()(如在A線)。什麼是規範獲得了在這種情況下,私有嵌套類(或它的成員)的精確的規則?標準對此有何評論?

回答

6

根據標準,$11.7/1 Nested classes [class.access.nest]

嵌套類是一個部件,因此具有相同的訪問權限的任何其它構件。

所以,這是很簡單的。 NestedBaseBase類的private構件,所以Base::NestedBase不能在main()訪問。

b.nested.Do();很好,因爲nestedDo()都是public成員。事實上,NestedBaseprivate嵌套類Base沒關係,這是這裏無關緊要。

2

類型名稱NestedBase是類的私有成員。

class Base 
{ 
private: 
    class NestedBase 
    { 
    public: 
     void Do() {} 
    }; 
    //... 

因此,您不能在聲明名稱的類之外顯式訪問它。

但可以訪問的名稱隱含以下方式:)

decltype(Base::nested) instance; 
+0

我認爲'基地:: nested'必須_public_ Base'的'成員。 @弗拉德,你的意思是? – dyomas