CPP:重载的嵌套运算符无法正常工作

时间:2016-12-07 13:42:17

标签: c++ operator-overloading

我覆盖了添加操作,因此我可以添加我的struct Vec3

的两个向量
// addition
Vec3 operator+(Vec3<T> &other) {
    return Vec3(this->x + other.x, this->y + other.y, this->z + other.z);
}
// product with one scalar
Vec3 operator*(float scalar) {
    return Vec3(this->x * scalar, this->y * scalar, this->z * scalar);
}

Vec3只有T型的三个属性。

使用它时T是浮点数,我执行此代码:

vec temp = vecOne * skalarOne + vecTwo * scalarTwo;

我收到此错误:

  

二元运算符&#39; +&#39;不能应用于类型的表达式   &#39;祈祷:: VEC 3&#39;并且&#39;祈祷:: Vec3&#39;

如果先计算乘法并将结果保存在向量中然后再进行向量加法,我就不会收到此错误。

任何人都有任何想法?谢谢!

2 个答案:

答案 0 :(得分:5)

您需要将功能签名更改为

Vec3 operator+(const Vec3<T> &other) const

&amp; c。,否则匿名临时无法绑定到它。

答案 1 :(得分:0)

你应该像这样返回对vec3的引用:

// addition
Vec3 operator+(const Vec3& other) {
    return { x + other.x, y + other.y, z + other.z };
}
// product with one scalar
Vec3 operator*(float scalar) {
    return { x * scalar, y * scalar, z * scalar };
}

编辑:这是我完整的可运行解决方案,如果上面的修复不适合你。

template <typename T>
class Vec3 {
public:
    Vec3(T x, T y, T z) : x(x), y(y), z(z) {}
    T x;
    T y;
    T z;

    // addition
    Vec3 operator+(const Vec3<T>& other) {
        return { x + other.x, y + other.y, z + other.z };
    }
    // product with one scalar
    Vec3 operator*(float scalar) {
        return { x * scalar, y * scalar, z * scalar };
    }
};

int main() {
    Vec3<float> a(2, 2, 2);
    Vec3<float> b(1, 2, 3);
    float num = 3;
    Vec3<float> c = a + b;
    Vec3<float> d = a * num;
    Vec3<float> e = a * num + b * num;
}