【发布时间】:2021-08-13 22:41:59
【问题描述】:
struct P {
int x, y;
friend P operator-(P u, P v) { return {u.x - v.x, u.y - v.y}; }
friend int cross(P u, P v) { return u.x * v.y - u.y * v.x; }
int cross(P u, P v) const { return cross(u - *this, v - *this); }
};
该方法是一个无限循环(它将调用自己而不是朋友)。
有什么方法可以在不改变界面(名称)的情况下解决这个问题?
【问题讨论】:
-
为什么必须内联定义朋友?是不是因为您希望它在普通名称查找中隐藏?
-
当我运行你的代码时,我得到这个编译错误
"error: no match for ‘operator-’ (operand types are ‘P’ and ‘const P’)"。你有任何编译错误吗?如果没有,你能告诉我们你的整个程序吗? -
在成员函数中,显式调用非成员(朋友)函数。例如,
int cross(P u, P v) {return ::cross(u - *this, v - *this);}。 [注意:我假设这就是您想要的效果。]。 -
在这种特殊情况下,朋友不需要访问 P 的内部。但是我没有看到一种简单的方法来定义全局之前(它需要声明 P)或之后(它破坏方法):/ @Peter 这就是我想要的,但编译器不会找到 ::与此修复交叉
-
简单:不要调用成员函数
cross。这真是令人困惑,如果您让我进行代码审查,它就会失败,没有如果或但是。为朋友留下名字cross,并为会员发明另一个名字。更好的是,完全放弃该成员并添加另一个具有 3 个参数的朋友。