| There are conflicting trait implementations for the same type. | |
| Erroneous code example: | |
| ```compile_fail,E0119 | |
| 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 } | |
| } | |
| ``` | |
| When looking for the implementation for the trait, the compiler finds | |
| both the `impl<T> MyTrait for T` where T is all types and the `impl | |
| MyTrait for Foo`. Since a trait cannot be implemented multiple times, | |
| this is an error. So, when you write: | |
| ``` | |
| trait MyTrait { | |
| fn get(&self) -> usize; | |
| } | |
| impl<T> MyTrait for T { | |
| fn get(&self) -> usize { 0 } | |
| } | |
| ``` | |
| This makes the trait implemented on all types in the scope. So if you | |
| try to implement it on another one after that, the implementations will | |
| conflict. Example: | |
| ``` | |
| 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(); // the trait is implemented so we can use it | |
| } | |
| ``` |