| You need to specify a specific implementation of the trait in order to call the | |
| method. | |
| Erroneous code example: | |
| ```compile_fail,E0790 | |
| trait Coroutine { | |
| fn create() -> u32; | |
| } | |
| struct Impl; | |
| impl Coroutine for Impl { | |
| fn create() -> u32 { 1 } | |
| } | |
| struct AnotherImpl; | |
| impl Coroutine for AnotherImpl { | |
| fn create() -> u32 { 2 } | |
| } | |
| let cont: u32 = Coroutine::create(); | |
| // error, impossible to choose one of Coroutine trait implementation | |
| // Should it be Impl or AnotherImpl, maybe something else? | |
| ``` | |
| This error can be solved by adding type annotations that provide the missing | |
| information to the compiler. In this case, the solution is to use a concrete | |
| type: | |
| ``` | |
| trait Coroutine { | |
| fn create() -> u32; | |
| } | |
| struct AnotherImpl; | |
| impl Coroutine for AnotherImpl { | |
| fn create() -> u32 { 2 } | |
| } | |
| let gen1 = AnotherImpl::create(); | |
| // if there are multiple methods with same name (different traits) | |
| let gen2 = <AnotherImpl as Coroutine>::create(); | |
| ``` |