Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The trait `A` is not implemented for the type `A`

Tags:

rust

traits

I am trying to use a trait that has a function that takes a closure as argument, and then use it on a trait object.

trait A {
    fn f<P>(&self, p: P) where P: Fn() -> ();
}

struct B {
    a: Box<A>
}

impl B {
    fn c(&self) {
        self.a.f(|| {});
    }
}

This snippet generates the following error:

the trait `A` is not implemented for the type `A` [E0277]

The version of rustc is rustc 1.0.0-beta.3 (5241bf9c3 2015-04-25) (built 2015-04-25).

like image 733
tofcoder Avatar asked May 05 '15 14:05

tofcoder


1 Answers

The problem is that method f is not object-safe because it is generic, and hence it can't be called on a trait object. You will have to force its users to pass boxed closure:

trait A {
    fn f(&self, p: Box<Fn() -> ()>);
}

I wonder why Rust allows Box<A> in the first place, I would expect an error there. And this particular error is really misleading. I would file a bug about this.

Alternatively, you can discard trait objects in favor of regular bounded generics, though it is not always possible.

like image 170
Vladimir Matveev Avatar answered Oct 14 '22 19:10

Vladimir Matveev