2012-08-29 41 views
2

我可以把朋友函數/類的定義放在另一個類中嗎?我的意思是這樣的:朋友內類定義

class Foo 
{ 
    friend void foo() {} // 1 
    friend class Bar {}; // 2 
}; 

gcc編譯好友功能,但不能編譯好友類。

回答

6

可以定義在friend聲明一個friend功能,它具有無法得到任何其他方式(在封閉類型是一個模板的情況下),有趣的行爲。

您不能在中定義 a friend類的朋友聲明,並且沒有必要這樣做。如果要創建一個新的類型內聯具有完全訪問權限,您可以創建一個嵌套類型。作爲成員,它將擁有完全訪問封閉類型的權限。唯一的區別是類型不會在命名空間級別找到,但是如果需要的話可以添加typedef(或者,也可以在名稱空間級別定義類,並在類中聲明友誼)。

class Outer { 
    int x; 
    class Inner { 
     static void f(Outer& o) { o.x = 5; } // fine 
    }; 
}; 
+1

任何你可以詳細闡述的機會(或者指向這樣做的鏈接)「它具有無法以任何其他方式獲得的有趣行爲(在封閉類型是模板的情況下)」 –

+0

@DaveS:它會創建一個非模板化的免費功能適用於每種即時類型,並且只能通過ADL才能看到--ie它不會污染封閉的名稱空間。所以它*一般*創建具有受限可見性的非模板化函數。 –

3

n3337 11.3/2

類應在朋友聲明來定義。 [示例:

class A { 
friend class B { }; // error: cannot define class in friend declaration 
}; 

末端示例]

但是你可以使用類似

class Foo 
{ 
    friend void foo() {} // 1 
    class Bar { }; 
    friend class Bar; // 2 
}; 
+6

嵌套類已經可以訪問父母成員,所以不需要將它變成朋友。 'n3376 11.7 [class.access.nest]' –

0

更改代碼: -

class Foo 
{ 
    friend void foo() {} // 1 
    friend class Bar ; // 2 
}; 
1

可以使其中嵌套類,according to defect report 45,可以訪問班級的私人成員。這是你的意思嗎?

「嵌套類是一個成員,因此具有與任何其他成員相同的訪問權限。」

這可能不適用於所有編譯器,因爲在此C++標準缺陷報告之前,嵌套類沒有特殊訪問權限。

+2

這個缺陷報告的日期從1998年開始,我期望大多數編譯器至少實現* C++ 03,所以這應該在* all *非古代編譯器中工作。 –

+0

更爲相關的是,它也可以根據C++ 11標準訪問私有成員。 –

+1

現在是標準的一部分:'n3376 11.7 [class.access.nest]' –