| 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() { |
| <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" |
| } |
| ``` |