## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Error code E0404

A type that is not a trait was used in a trait position, such as a bound or `impl`.

Erroneous code example:

    #![allow(unused)]
    fn main() {
    struct Foo;
    struct Bar;

    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:

    #![allow(unused)]
    fn main() {
    type Foo = Iterator<Item=String>;

    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 identifier was used. Example:

    #![allow(unused)]
    fn main() {
    trait Foo {
        // some functions
    }
    struct Bar;

    impl Foo for Bar { // ok!
        // functions implementation
    }

    fn baz<T: Foo>(t: T) {} // ok!
    }

Alternatively, you could introduce a new trait with your desired restrictions as a super trait:

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

    #![allow(unused)]
    #![feature(trait_alias)]
    fn main() {
    trait Foo = Iterator<Item=String>;

    fn bar<T: Foo>(t: T) {} // ok!
    }