The compiler doesn't know what method to call because more than one method has the same prototype. Erroneous code example: ```compile_fail,E0034 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() { ::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" } ```