我做了一个通用的Vector结构体,用于不同的T类型:
struct Vector<T> {
data: [T; 3],
}
字符串
我已经为数学操作数实现了一些通用的trait(Eq
,Index
,std::ops::Add
...),它工作得很好。
但是现在,我正在努力实现一个From
trait,这样我就可以轻松地将Vector转换为Vector。
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
?
1条答案
按热度按时间13z8s7eq1#
您不能编写此实现。
即使你是
From
的所有者,你也不能写这个绑定,因为它与impl<T> From<T> for T
冲突,其中T == U
。事实上,有些人希望标准库为集合写这个impl(例如,Option<T>
),尽管标准库是From
的所有者,但它不能提供这个impl。您可以提供一个方法来实现这一点,而不是trait实现。