| A type mismatched an associated type of a trait. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0271 |
| trait Trait { type AssociatedType; } |
| |
| fn foo<T>(t: T) where T: Trait<AssociatedType=u32> { |
| // ~~~~~~~~ ~~~~~~~~~~~~~~~~~~ |
| // | | |
| // This says `foo` can | |
| // only be used with | |
| // some type that | |
| // implements `Trait`. | |
| // | |
| // This says not only must |
| // `T` be an impl of `Trait` |
| // but also that the impl |
| // must assign the type `u32` |
| // to the associated type. |
| println!("in foo"); |
| } |
| |
| impl Trait for i8 { type AssociatedType = &'static str; } |
| //~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // | | |
| // `i8` does have | |
| // implementation | |
| // of `Trait`... | |
| // ... but it is an implementation |
| // that assigns `&'static str` to |
| // the associated type. |
| |
| foo(3_i8); |
| // Here, we invoke `foo` with an `i8`, which does not satisfy |
| // the constraint `<i8 as Trait>::AssociatedType=u32`, and |
| // therefore the type-checker complains with this error code. |
| ``` |
| |
| The issue can be resolved by changing the associated type: |
| 1) in the `foo` implementation: |
| ``` |
| trait Trait { type AssociatedType; } |
| |
| fn foo<T>(t: T) where T: Trait<AssociatedType = &'static str> { |
| println!("in foo"); |
| } |
| |
| impl Trait for i8 { type AssociatedType = &'static str; } |
| |
| foo(3_i8); |
| ``` |
| |
| 2) in the `Trait` implementation for `i8`: |
| ``` |
| trait Trait { type AssociatedType; } |
| |
| fn foo<T>(t: T) where T: Trait<AssociatedType = u32> { |
| println!("in foo"); |
| } |
| |
| impl Trait for i8 { type AssociatedType = u32; } |
| |
| foo(3_i8); |
| ``` |