2011-05-12 63 views
14

我有以下代碼,其中類A聲明類B爲朋友。在B類中聲明的C類是否應該能夠查看A類的私人聲明/成員?一個類的「朋友」是否擴展到該類中聲明的類?

它使用CL版本16(Visual Studio 2010)編譯沒有錯誤,但gcc g ++版本4.1.1給出了錯誤「typedef int A :: T在此上下文中是私有的」。

函數調用發生的行爲與typedefs相同(這是我發現的區別)。

class A { 
    friend class B; 
    typedef int T; 
}; 

class B { 
    A::T t; // ok 
    typedef A::T U; // ok 
    class C { 
     U u; // ok 
     A::T v; // compile error on gcc 
    }; 
}; 

我簡要介紹了一下,但未能找到正確的搜索關鍵字。我還沒有閱讀標準。是否有任何關於此主題的問題,或在C++ FAQ中提及?標準會影響哪種行爲?

+0

請參閱http://stackoverflow.com/questions/3584385/friend-access-to-protected-nested-class。 – 2011-05-12 08:39:52

+0

這段代碼看起來很適合我。獲取gcc 4.5.1和在線上的comeau編譯。 – 2011-05-12 08:45:24

+0

Prasoon:呵呵。我想知道爲什麼我的gcc過時了,它應該是新安裝的。好吧。謝謝! – 2011-05-12 09:00:04

回答

9

從標準文檔,$11.4.2

聲明一個類是朋友意味着private和protected成員從類授予友誼名 可以在基本符S和成員進行訪問聲明友誼班。

從標準文檔的例子中,自身,

class A { 
class B { }; 
friend class X; 
}; 
struct X : A::B { // OK: A::B accessible to friend 
    A::B mx; // OK: A::B accessible to member of friend 
    class Y { 
     A::B my; // OK: A::B accessible to nested member of friend 
    }; 
}; 

因此它應該工作而沒有任何錯誤。

+0

謝謝!看起來對我來說是authoratative。 – 2011-05-12 08:59:35

+0

也請看[this](http://stackoverflow.com/questions/5975421/does-friending-a-class-extend-to-classes-declared-within-that-c​​lass/5975757#5975757)回答。 – 2011-05-12 09:20:57

4

似乎有some defect in the original standard C++03

按照C++ 03 [預CD1]你的代碼不應該編譯,因爲措辭和例子說,一個班(授予友誼)的私有成員不能在訪問朋友類的嵌套成員。

C++ 11給出了與C++ 03中相同的示例。對這個例子唯一的改變是朋友類的嵌套成員(類)能夠訪問授予友誼的類的私有成員。

聲明一個類是一個朋友意味着來自授予友誼的類的私有和受保護成員的名字可以在友誼類的基本說明符和成員聲明中訪問。

也期待在issue #45

+0

啊!再次感謝你。 – 2011-05-12 09:25:08

0

Prasoon提到的問題#45 ...中的C++ 0x這種行爲的改變。舊的行爲(11.7 [class.access.nest]第1款):

嵌套類的成員有一個封閉類的成員沒有特殊的訪問,也不限於已授予友誼的封閉類的類或函數。

這清楚地表明,根據C++ 03規則,gcc 4.1是正確的。 gcc 4.5和MSVC2010使用C++ 0x規則。