blob: d82171533ae51c6bf1e3b88b9d7f423196fd81af [file] [log] [blame] [view]
The `Self` keyword was used outside an impl, trait, or type definition.
Erroneous code example:
```compile_fail,E0411
<Self>::foo; // error: use of `Self` outside of an impl, trait, or type
// definition
```
The `Self` keyword represents the current type, which explains why it can only
be used inside an impl, trait, or type definition. It gives access to the
associated items of a type:
```
trait Foo {
type Bar;
}
trait Baz : Foo {
fn bar() -> Self::Bar; // like this
}
```
However, be careful when two types have a common associated type:
```compile_fail
trait Foo {
type Bar;
}
trait Foo2 {
type Bar;
}
trait Baz : Foo + Foo2 {
fn bar() -> Self::Bar;
// error: ambiguous associated type `Bar` in bounds of `Self`
}
```
This problem can be solved by specifying from which trait we want to use the
`Bar` type:
```
trait Foo {
type Bar;
}
trait Foo2 {
type Bar;
}
trait Baz : Foo + Foo2 {
fn bar() -> <Self as Foo>::Bar; // ok!
}
```