解决方法
Jacob是正确的…在类中声明的一个朋友的功能可以访问该类,但它不在类的内部,而其他人都可以访问它.
对于不是类的成员的操作符重载(也称为空闲函数,它可能是一个朋友,或者可能不是),参数与操作数相同.对于一个类的成员,第一个操作数是“隐含参数”,这就是这个.
隐含的参数与以下几种方式的自由函数的第一个参数不同:
>它的类型是reference-to-class,而free函数可以为其第一个参数声明任何类型.
>它不参与隐式类型转换. (它不会被转换构造函数初始化).
>它确实参与虚拟覆盖解析. (虚拟过载将由第一个操作数的动态类型选择,而不带额外代码的自由函数是不可能的).
对于一元,二进制或n-ary(对于operator()),情况是相同的.
成员特权突变:改变第一个操作数(例如=,=,前缀)的操作符应作为成员函数实现,并且应该专门实现所有重载的内容. Postfix是二等公民;它被实现为Obj ret = * this;这个;返回.请注意,这有时扩展到复制构造函数,它可能包含* this = initializer.
通勤者自由:只有交换操作符(如/)应该是自由职能;所有其他操作符(如一元任何东西)都应该是会员.交换运算符固有地制作对象的副本;它们被实现为Obj ret = lhs; ret @ = rhs;返回其中@是交换运算符,lhs和rhs分别是左侧和右侧参数.
C友谊的金色规则:避免友谊.朋友污染了设计的语义.重载推论:如果您遵循上述规则,重载过程很简单,那么朋友是无害的.有趣的样板重载定义允许将它们放在类{括号中.
请注意,一些运算符不能是免费函数:=,– > []和(),因为标准在第13.5节中具体说明了这一点.我认为这一切都是…我想到一元&和*也是,但我显然是错误的.他们应该永远作为成员超载,但只有仔细思考!