| A non-default implementation was already made on this type so it cannot be |
| specialized further. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0520 |
| #![feature(specialization)] |
| |
| trait SpaceLlama { |
| fn fly(&self); |
| } |
| |
| // applies to all T |
| impl<T> SpaceLlama for T { |
| default fn fly(&self) {} |
| } |
| |
| // non-default impl |
| // applies to all `Clone` T and overrides the previous impl |
| impl<T: Clone> SpaceLlama for T { |
| fn fly(&self) {} |
| } |
| |
| // since `i32` is clone, this conflicts with the previous implementation |
| impl SpaceLlama for i32 { |
| default fn fly(&self) {} |
| // error: item `fly` is provided by an `impl` that specializes |
| // another, but the item in the parent `impl` is not marked |
| // `default` and so it cannot be specialized. |
| } |
| ``` |
| |
| Specialization only allows you to override `default` functions in |
| implementations. |
| |
| To fix this error, you need to mark all the parent implementations as default. |
| Example: |
| |
| ``` |
| #![feature(specialization)] |
| |
| trait SpaceLlama { |
| fn fly(&self); |
| } |
| |
| // applies to all T |
| impl<T> SpaceLlama for T { |
| default fn fly(&self) {} // This is a parent implementation. |
| } |
| |
| // applies to all `Clone` T; overrides the previous impl |
| impl<T: Clone> SpaceLlama for T { |
| default fn fly(&self) {} // This is a parent implementation but was |
| // previously not a default one, causing the error |
| } |
| |
| // applies to i32, overrides the previous two impls |
| impl SpaceLlama for i32 { |
| fn fly(&self) {} // And now that's ok! |
| } |
| ``` |