gpt4 book ai didi

rust - 通用实现得到 "cannot add ' T' 到 'T' 错误

转载 作者:行者123 更新时间:2023-12-03 11:41:52 25 4
gpt4 key购买 nike

我正在尝试通用实现,并尝试添加一个结构的 x 和 y 字段,它们都是 T 类型,
我在 impl<T> Point<T> 下看到一条红色波浪线以及以下错误消息...

cannot add `T` to `T`

no implementation for `T + T`

help: the trait `std::ops::Add` is not implemented for `T`
从我的代码中可以看出,我已经添加了特征 std::ops::Add对于类型 T .
如何使下面的代码正常工作?
struct Point<T>
where
T: std::ops::Add<Output = T>,
{
x: T,
y: T,
}

impl Point<f32> {
fn add_f32(&self) -> f32 {
self.x + self.y
}
}

//error
impl<T> Point<T> {
fn add(&self) -> T
where
T: std::ops::Add<Output = T>,
{
self.x + self.y
}
}

最佳答案

这个问题有两种解决方案,各有优劣。
第一个解决方案是删除 T: std::ops::Add<Output = T>从结构定义绑定(bind):

struct Point<T> {
x: T,
y: T,
}
这意味着 add()方法不适用于类型 Point<T> , 如果 T未实现 Add .但是,您仍然可以创建这样的类型。如果您随后尝试调用 add()方法,Rust 会显示错误 - playground link .
另一种解决方案是保持 trait 绑定(bind),这意味着每次使用时都必须强制执行:
struct Point<T: Add<Output = T>> {
x: T,
y: T,
}

impl<T: Add<Output = T>> Point<T> {
// ^^^^^^^^^^^^^^^ required
...
}
这意味着 Point<T>仅当 T 时才存在实现 Add .如果类型为 Point<SomeTypeThatIsntAdd>,则可以执行此操作根本没有意义或没用。在某些情况下,它还改进了编译器诊断。

关于rust - 通用实现得到 "cannot add ' T' 到 'T' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62513401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com