Closed
Description
use std::default::Default;
trait Maker {
type Item;
fn make(&mut self) -> Self::Item;
}
struct Foo<T> {
a: T,
}
struct Bar;
impl<T> Maker for Bar
where T: Default {
type Item = Foo<T>;
fn make(&mut self) -> Foo<T> {
Foo {
a: <T as Default>::default(),
}
}
}
The code above fails to compile with error ...
tests/lang.rs:1000:10: 1000:11 error: the type parameter `T` is not constrained by the impl trait, self type, or predicates [E0207]
tests/lang.rs:1000 impl<T> Maker for Bar
... even though T
is used in the associated type Foo
. This example looks very similar to a legal case in the respective RFC, namely:
// Legal:
// - A is used in the self type.
// - B is used in the input trait type parameters.
impl<A,B> SomeTrait<Option<B>> for Foo<A> {
type Output = Result<A, IoError>;
}
One workaround is the use of PhantomData
...
use std::marker::PhantomData;
struct Bar<T> {
_m: PhantomData<T>
}
impl<T> Maker for Bar<T>
where T: Default {
type Item = Foo<T>;
fn make(&mut self) -> Foo<T> {
Foo {
a: <T as Default>::default(),
}
}
}
... which to my mind shouldn't be required in the first place.
Meta
$ rustc --verbose --version
rustc 1.0.0-nightly (522d09dfe 2015-02-19) (built 2015-02-19)
binary: rustc
commit-hash: 522d09dfecbeca1595f25ac58c6d0178bbd21d7d
commit-date: 2015-02-19
build-date: 2015-02-19
host: x86_64-apple-darwin
release: 1.0.0-nightly
Metadata
Metadata
Assignees
Labels
No labels