在“C++ 编程语言”的第 11.5.1 节中,Bjarne Stroustrup 写道:
与成员声明一样,友元声明不会将名称引入封闭范围。
例如:
class Matrix { friend class Xform; friend Matrix invert (const Matrix &); //.. }; Xform x; // error: no Xform in scope Matrix (*p) (const Matrix &) = &invert; // error: no invert() in scope
对于大型程序和大型类,一个类不会“悄悄地”将名称添加到其封闭范围是很好的。对于可以在许多不同上下文中实例化的模板类(第 13 章),这非常重要。
然而,下一节接着说这个类必须是先前定义的,或者定义在非类范围内,立即包含声明它为友元的类。
我的问题是,由于该类需要预先定义或定义在非类范围内立即封闭声明它为朋友的类,因此在第一个示例Xform
中不能超出范围,因为大概类会在定义类之前已经定义了Matrix
。此外,鉴于朋友类需要预先定义或在授予者类之后立即定义的限制,我想不出这样的情况,朋友类将不在范围内!
其次,我在本节中对 Bjarne 的解释是否正确,因为:
- 仅对于友元类,友元类必须先前已在封闭范围中定义,或者在非类范围之后立即定义。
- 对于一个函数,必须先前已在封闭范围内声明,或者也可以通过具有类型 == '友谊授予者' 类的参数来找到它?