C++ 二进制表达式';对象';和';对象';

C++ 二进制表达式';对象';和';对象';,c++,C++,我有一个向量类 class Vector { public: double x, y, z; Vector operator * (Vector& v) { return Vector(x*v.x, y*v.y, z*v.z); }; 一类射线 class Ray { Vector origin, direction; public: Ray(); Ray(Vector, Vector); Vector getRayOrigin() { retu

我有一个向量类

class Vector {
public:
double x, y, z;
Vector operator * (Vector& v) {
    return Vector(x*v.x, y*v.y, z*v.z);
};
一类射线

class Ray {
    Vector origin, direction;
public:
    Ray();
    Ray(Vector, Vector);
    Vector getRayOrigin() { return origin; }
    Vector getRayDirection() { return direction; }
};
我有一节飞机课

class Plane {
public:
Vector normal;
double distance;
double Plane::hit(Ray ray) {
    Vector rayOrigin = ray.getRayOrigin();
    Vector t = normal * rayDirection; // works
    Vector tt = normal * ray.getRayOrigin(); // doesn't work
}
我不明白为什么调用
normal*ray.getRayOrigin()
不起作用
错误:二进制表达式“Vector”和“Vector”的操作数无效。

操作失败,因为
getRayOrigin()
返回的临时向量无法绑定到非常量引用。要解决此问题,请将
Vector&v
更改为
Vector const&v

最好使用不会将第一个操作数更改为非成员函数的运算符:

Vector operator * (Vector const & v, Vector const & w)
{
    return Vector(v.x*w.x, v.y*w.y, v.z*v.z);
}
有关更多说明,请参见。

ray.getRayOrigin()
不返回
向量&
,它返回
向量
,并且返回一个临时向量。将运算符的参数更改为
const Vector&
(就这一点而言,
operator*
本身也值得
const