Error code E0411

The Self keyword was used outside an impl, trait, or type definition.

Erroneous code example:

#![allow(unused)]
fn main() {
<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:

#![allow(unused)]
fn main() {
trait Foo {
    type Bar;
}

trait Baz : Foo {
    fn bar() -> Self::Bar; // like this
}
}

However, be careful when two types have a common associated type:

#![allow(unused)]
fn main() {
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:

#![allow(unused)]
fn main() {
trait Foo {
    type Bar;
}

trait Foo2 {
    type Bar;
}

trait Baz : Foo + Foo2 {
    fn bar() -> <Self as Foo>::Bar; // ok!
}
}