Error code E0034
The compiler doesn't know what method to call because more than one method has the same prototype.
Erroneous code example:
struct Test; trait Trait1 { fn foo(); } trait Trait2 { fn foo(); } impl Trait1 for Test { fn foo() {} } impl Trait2 for Test { fn foo() {} } fn main() { Test::foo() // error, which foo() to call? }
To avoid this error, you have to keep only one of them and remove the others. So let's take our example and fix it:
struct Test; trait Trait1 { fn foo(); } impl Trait1 for Test { fn foo() {} } fn main() { Test::foo() // and now that's good! }
However, a better solution would be using fully explicit naming of type and trait:
struct Test; trait Trait1 { fn foo(); } trait Trait2 { fn foo(); } impl Trait1 for Test { fn foo() {} } impl Trait2 for Test { fn foo() {} } fn main() { <Test as Trait1>::foo() }
One last example:
trait F { fn m(&self); } trait G { fn m(&self); } struct X; impl F for X { fn m(&self) { println!("I am F"); } } impl G for X { fn m(&self) { println!("I am G"); } } fn main() { let f = X; F::m(&f); // it displays "I am F" G::m(&f); // it displays "I am G" }