我可以把朋友函數/類的定義放在另一個類中嗎?我的意思是這樣的:朋友內類定義
class Foo
{
friend void foo() {} // 1
friend class Bar {}; // 2
};
gcc編譯好友功能,但不能編譯好友類。
我可以把朋友函數/類的定義放在另一個類中嗎?我的意思是這樣的:朋友內類定義
class Foo
{
friend void foo() {} // 1
friend class Bar {}; // 2
};
gcc編譯好友功能,但不能編譯好友類。
可以定義在friend聲明一個friend
功能,它具有無法得到任何其他方式(在封閉類型是一個模板的情況下),有趣的行爲。
您不能在中定義 a friend
類的朋友聲明,並且沒有必要這樣做。如果要創建一個新的類型內聯具有完全訪問權限,您可以創建一個嵌套類型。作爲成員,它將擁有完全訪問封閉類型的權限。唯一的區別是類型不會在命名空間級別找到,但是如果需要的話可以添加typedef(或者,也可以在名稱空間級別定義類,並在類中聲明友誼)。
class Outer {
int x;
class Inner {
static void f(Outer& o) { o.x = 5; } // fine
};
};
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
};
嵌套類已經可以訪問父母成員,所以不需要將它變成朋友。 'n3376 11.7 [class.access.nest]' –
更改代碼: -
class Foo
{
friend void foo() {} // 1
friend class Bar ; // 2
};
可以使其中嵌套類,according to defect report 45,可以訪問班級的私人成員。這是你的意思嗎?
「嵌套類是一個成員,因此具有與任何其他成員相同的訪問權限。」
這可能不適用於所有編譯器,因爲在此C++標準缺陷報告之前,嵌套類沒有特殊訪問權限。
這個缺陷報告的日期從1998年開始,我期望大多數編譯器至少實現* C++ 03,所以這應該在* all *非古代編譯器中工作。 –
更爲相關的是,它也可以根據C++ 11標準訪問私有成員。 –
現在是標準的一部分:'n3376 11.7 [class.access.nest]' –
任何你可以詳細闡述的機會(或者指向這樣做的鏈接)「它具有無法以任何其他方式獲得的有趣行爲(在封閉類型是模板的情況下)」 –
@DaveS:它會創建一個非模板化的免費功能適用於每種即時類型,並且只能通過ADL才能看到--ie它不會污染封閉的名稱空間。所以它*一般*創建具有受限可見性的非模板化函數。 –