C++ 类内朋友的定义
我可以将友元函数/类的定义放在另一个类中吗?我的意思是这样的:C++ 类内朋友的定义,c++,C++,我可以将友元函数/类的定义放在另一个类中吗?我的意思是这样的: class Foo { friend void foo() {} // 1 friend class Bar {}; // 2 }; gcc编译friend函数,但无法编译friend类。n3337 11.3/2 类不应在友元声明中定义。[示例: class A { friend class B { }; // error: cannot define class in friend declaration };
class Foo
{
friend void foo() {} // 1
friend class Bar {}; // 2
};
gcc编译friend函数,但无法编译friend类。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
};
将代码更改为:-
class Foo
{
friend void foo() {} // 1
friend class Bar ; // 2
};
您可以创建一个嵌套类,该类可以访问该类的私有成员。这就是你的意思吗 “嵌套类是成员,因此具有与任何其他成员相同的访问权限。” 这可能在所有编译器中都不起作用,因为在C++标准缺陷报告之前,嵌套类没有特殊的访问。 可以在朋友声明中定义<代码>朋友< /C>函数,并且它具有无法以任何其他方式获得的有趣行为(在封闭类型是模板的情况下)。p> 不能在friend声明中定义
friend
类,也不需要这样做。如果要创建具有完全访问权限的内联新类型,只需创建嵌套类型即可。作为成员,它将拥有对封闭类型的完全访问权限。唯一的区别是在名称空间级别找不到该类型,但是如果需要,可以添加一个typedef(或者,在名称空间级别定义类,并在类内声明友谊)
该缺陷报告始于1998年,我希望大多数编译器至少实现C++03,因此这应该适用于所有非古代编译器。更相关的是,它还可以根据C++11标准访问私有成员。现在是该标准的一部分:
n3376 11.7[class.access.nest]
正如@DavidRodríguez dribeas所建议的那样,大多数编译器肯定至少实现了C++03,但我偶尔会被提醒,有少数不幸的编译器仍然使用Visual Studio 6.0。嵌套类已经可以访问父类成员,因此无需将其作为朋友n3376 11.7[class.access.nest]
您是否有机会详细说明(或指向这样做的链接)“它有其他任何方式都无法获得的有趣行为(如果封闭类型是模板)”@DaveS:它将为每个实例化类型创建一个非模板自由函数,它将以一种只有通过ADL才能看到的方式来实现——也就是说,它不会污染封闭的名称空间。因此,它一般创建具有受限可见性的非模板函数。
class Outer {
int x;
class Inner {
static void f( Outer& o ) { o.x = 5; } // fine
};
};