我可以把朋友函数/类的定义放在另一个类中吗?我的意思是这样的:朋友内类定义
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它不会污染封闭的名称空间。所以它*一般*创建具有受限可见性的非模板化函数。 –