| An attempt was made to retrieve an associated type, but the type was ambiguous. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0221 |
| trait T1 {} |
| trait T2 {} |
| |
| trait Foo { |
| type A: T1; |
| } |
| |
| trait Bar : Foo { |
| type A: T2; |
| fn do_something() { |
| let _: Self::A; |
| } |
| } |
| ``` |
| |
| In this example, `Foo` defines an associated type `A`. `Bar` inherits that type |
| from `Foo`, and defines another associated type of the same name. As a result, |
| when we attempt to use `Self::A`, it's ambiguous whether we mean the `A` defined |
| by `Foo` or the one defined by `Bar`. |
| |
| There are two options to work around this issue. The first is simply to rename |
| one of the types. Alternatively, one can specify the intended type using the |
| following syntax: |
| |
| ``` |
| trait T1 {} |
| trait T2 {} |
| |
| trait Foo { |
| type A: T1; |
| } |
| |
| trait Bar : Foo { |
| type A: T2; |
| fn do_something() { |
| let _: <Self as Bar>::A; |
| } |
| } |
| ``` |