Rust中泛型Point类型因类型限制无法实现+运算符重载,求解决方案
为泛型Point类型实现加法运算符
我想要实现一个方法,让两个自定义的Point类型可以相加,这个类型通过泛型支持任意整数或浮点数类型。
现有代码
Point结构体定义
pub struct Point<T: PointTypeTrait>{ x: T, y: T }
类型约束Trait
pub trait PointTypeTrait{} impl PointTypeTrait for i8{} impl PointTypeTrait for i16{} impl PointTypeTrait for i32{} impl PointTypeTrait for i64{} impl PointTypeTrait for i128{} impl PointTypeTrait for f32{} impl PointTypeTrait for f64{}
尝试实现Add trait的代码
impl<T: PointTypeTrait> Add for Point<T> { type Output = Point<T>; fn add(self, other: Point<T>) -> Self::Output { Point::new_point( self.x + other.x, self.y + other.y) } }
编译错误
error[E0369]: cannot add `T` to `T` --> src/point.rs:34:20 | 34 | self.x + other.x, | ------ ^ ------- T | | | T | help: consider further restricting this bound | 29 | impl<T: PointTypeTrait + std::ops::Add<Output = T>> Add for Point<T> { | +++++++++++++++++++++++++++
解决方案
问题出在PointTypeTrait仅标记了允许使用的类型,但没有保证这些类型支持加法操作(即实现了std::ops::Add trait)。编译器无法确认T类型可以执行+运算,因此报错。
有两种可行的实现方式:
方式一:直接为泛型T添加Add约束
按照编译器提示,修改Add trait的实现,给T同时加上PointTypeTrait和std::ops::Add<Output = T>的约束:
use std::ops::Add; impl<T: PointTypeTrait + Add<Output = T>> Add for Point<T> { type Output = Point<T>; fn add(self, other: Point<T>) -> Self::Output { Point::new_point(self.x + other.x, self.y + other.y) } }
这样既保证了T是你允许的数值类型,又确保它支持加法运算,且加法结果的类型还是T。
方式二:将Add约束整合到PointTypeTrait中
如果你希望所有实现PointTypeTrait的类型都自动支持加法,可以修改Trait定义,让它继承Add:
use std::ops::Add; pub trait PointTypeTrait: Add<Output = Self> {} impl PointTypeTrait for i8{} impl PointTypeTrait for i16{} impl PointTypeTrait for i32{} impl PointTypeTrait for i64{} impl PointTypeTrait for i128{} impl PointTypeTrait for f32{} impl PointTypeTrait for f64{}
此时原来的Add实现就可以保持不变,因为T: PointTypeTrait已经隐含了T: Add<Output = T>的约束:
use std::ops::Add; impl<T: PointTypeTrait> Add for Point<T> { type Output = Point<T>; fn add(self, other: Point<T>) -> Self::Output { Point::new_point(self.x + other.x, self.y + other.y) } }
两种方式都能解决编译错误,选择哪种取决于你的需求:如果未来可能需要让某些实现PointTypeTrait的类型不支持加法,就选方式一;如果所有PointTypeTrait类型都必须支持加法,方式二更简洁。
内容的提问来源于stack exchange,提问作者pdaranda661
相关产品推荐
相关产品推荐

