我制作了一个通用的 Vector 结构,与不同的 T 类型一起使用:
struct Vector<T> {
data: [T; 3],
}
Eq
我已经为数学操作数( 、Index
、 ...)实现了一些通用特征std::ops::Add
,并且效果很好。
但现在,我正在努力实现一个From
特征,以便我可以轻松地将向量转换为向量。
impl<T, U> From<Vector<U>> for Vector<T> {
fn from(item: Vector<U>) -> Self {
// [...]
}
}
无论此from
函数的实现如何,我都会收到以下错误:
error[E0119]: conflicting implementations of trait `From<Vector<_>>` for type `Vector<_>`
--> <source>:5:1
|
5 | impl<T, U> From<Vector<U>> for Vector<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
如果我理解正确的话,那是因为默认情况下,对于任何类型,From<Vector<T>> for Vector<T>
都已经声明了。T
如果和是相同的类型,我的实现会与之冲突U
。
那么有没有一种方法可以将我的实现用于任何不同的类型T
和U
,但不能将其用于相同的类型T
和U
?
您无法编写此实现。
即使您是 的所有者,
From
您也无法编写此绑定,因为它与impl<T> From<T> for T
where冲突T == U
。事实上,有些人希望标准库为集合(例如,Option<T>
)编写此 impl,尽管标准库是它的所有者,但From
无法提供此 impl。您可以提供一种方法来执行此操作,而不是特征实现。