I have a design issue when using something like:
trait MyTrait<K: OtherTrait> { ... } impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
I cannot implement the trait for this trait due to error E207 ("the parameter of type K not limited to the sign of impl, self type or predicates").
It is impossible to get rid of this error, I am applying this not very good workaround (verbose and struct without any internal value):
use std::fmt; use std::marker::PhantomData; pub trait MyTrait<K: fmt::Display> { fn get_some_k(&self) -> Option<K>; } /* // This is my target impl but results in E207 due to K not constrained impl<K: fmt::Display, S: MyTrait<K>> fmt::Display for S { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.get_some_k().unwrap()) } } */ pub struct Ugly<'a, K: fmt::Display, S: 'a + MyTrait<K>>(&'a S, PhantomData<K>); impl<'a, K: fmt::Display, S: MyTrait<K>> fmt::Display for Ugly<'a, K, S> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0.get_some_k().unwrap()) } } fn main() { }
I think there must be some better way to implement the trait for this type of parameterized trait.
I did not find a good example in std (for example, there is no Display implementation in features with an associated type like Iterator )?
cheme source share