1
Fork 0

Mention trait alias on the E0404 note

This commit is contained in:
Yuki Okushi 2021-04-01 08:39:48 +09:00
parent 539242a07b
commit eea27b8136

View file

@ -8,14 +8,15 @@ struct Foo;
struct Bar; struct Bar;
impl Foo for Bar {} // error: `Foo` is not a trait impl Foo for Bar {} // error: `Foo` is not a trait
fn baz<T: Foo>(t: T) {} // error: `Foo` is not a trait
``` ```
Another erroneous code example: Another erroneous code example:
```compile_fail,E0404 ```compile_fail,E0404
struct Foo; type Foo = Iterator<Item=String>;
fn bar<T: Foo>(t: T) {} // error: `Foo` is not a trait fn bar<T: Foo>(t: T) {} // error: `Foo` is a type alias
``` ```
Please verify that the trait's name was not misspelled or that the right Please verify that the trait's name was not misspelled or that the right
@ -30,14 +31,27 @@ struct Bar;
impl Foo for Bar { // ok! impl Foo for Bar { // ok!
// functions implementation // functions implementation
} }
fn baz<T: Foo>(t: T) {} // ok!
``` ```
or: Alternatively, you could introduce a new trait with your desired restrictions
as a super trait:
``` ```
trait Foo { # trait Foo {}
// some functions # struct Bar;
} # impl Foo for Bar {}
trait Qux: Foo {} // Anything that implements Qux also needs to implement Foo
fn baz<T: Qux>(t: T) {} // also ok!
```
Finally, if you are on nightly and want to use a trait alias
instead of a type alias, you should use `#![feature(trait_alias)]`:
```
#![feature(trait_alias)]
trait Foo = Iterator<Item=String>;
fn bar<T: Foo>(t: T) {} // ok! fn bar<T: Foo>(t: T) {} // ok!
``` ```