E0119

未匹配的标注

对于同一类型存在互相矛盾的 trait 实现。

错误代码示例:


trait MyTrait {
    fn get(&self) -> usize;
}

impl<T> MyTrait for T {
    fn get(&self) -> usize { 0 }
}

struct Foo {
    value: usize
}

impl MyTrait for Foo { // error: conflicting implementations of trait
                       //        `MyTrait` for type `Foo`
    fn get(&self) -> usize { self.value }
}

在寻找 trait 的时候,编译器找到了 impl<T> MyTrait for T T 是任意类型和 impl MyTrait for Foo 。 由于一个 trait 不能被实现多次,因此这是一个错误。所以当你写出:


trait MyTrait {
    fn get(&self) -> usize;
}

impl<T> MyTrait for T {
    fn get(&self) -> usize { 0 }
}

这使得 trait 在这个域上为所有类型实现了。 所以如果你试图在后面实现另一个,就会产生冲突。例如:


trait MyTrait {
    fn get(&self) -> usize;
}

impl<T> MyTrait for T {
    fn get(&self) -> usize { 0 }
}

struct Foo;

fn main() {
    let f = Foo;

    f.get(); // (该类型的这个 MyTrait)trait 已经实现了,所以我们可以使用它
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~