模板化返回类型以及ops :: Mul trait的RHS类型

时间:2016-12-30 18:25:07

标签: rust operator-overloading

我想为多种类型重载操作符特征。在此示例中,3D矢量可能会乘以标量(缩放矢量分量并返回矢量)或另一个矢量(计算点积并返回标量)。

我需要一个与'How can an operator be overloaded for different RHS types and return values?'中提供的解决方案类似的解决方案。这是大致原始代码中已接受解决方案的代码。我删除了引用,因为它们似乎不需要。

use std::ops;

#[derive(Debug)]
struct Vector3D {
    x: f32,
    y: f32,
    z: f32,
}

trait MulVector3D<ResType> {
    fn do_mul(self, rhs: Vector3D) -> ResType;
}


impl MulVector3D<Vector3D> for f32 {
    fn do_mul(self, rhs: Vector3D) -> Vector3D {
        Vector3D {
            x: self * rhs.x,
            y: self * rhs.y,
            z: self * rhs.z,
        }
    }
}

impl MulVector3D<f32> for Vector3D {
    fn do_mul(self, rhs: Vector3D) -> f32 {
        self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
    }
}

impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
    fn mul(self, rhs: RHS) -> ResType {
        rhs.do_mul(self)
    }
}

fn main() {
    let a = Vector3D {
        x: 1.0,
        y: 2.0,
        z: 3.0,
    };

    let b = a * -1.0;
    let c = a * b;

    println!("{:?}", a);
    println!("{:?}", b);
    println!("{:?}", c);
}

然而,这对我来说似乎不起作用,我想知道语言规范是否因此而改变。我收到以下错误消息:

error[E0207]: the type parameter `ResType` is not constrained by the impl trait, self type, or predicates
  --> src/main.rs:31:6
   |
31 | impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
   |      ^^^^^^^ unconstrained type parameter

error[E0207]: the type parameter `RHS` is not constrained by the impl trait, self type, or predicates
  --> src/main.rs:31:15
   |
31 | impl<ResType, RHS: MulVector3D<ResType>> ops::Mul for Vector3D {
   |               ^^^ unconstrained type parameter

我做了一些搜索,说实话,我甚至不知道如何紧凑地说出这个问题以获得有意义的答案。 AFAIK,ResType模板参数确实不受约束,但我不明白为什么这是一个问题。至于RHS,实际上这限制了实现MulVector3D<ResType>特征。所以再一次,我没有看到错误消息试图告诉我的内容。

你能解释一下这个错误消息吗?实际上我可能会尝试做什么,或者因为某些语言改变原来的问题而被禁止了?

0 个答案:

没有答案