In Rust 1.15, I have created a trait to abstract over reading & parsing file format(s). I\'m trying to create a struct which has this generic trait inside.
I hav
The error message gives you a suggestion to use a marker, like PhantomData. You can do it like this:
use std::marker::PhantomData;
struct MyIterThing<'a, R: Read, T: MyReader + 'a> {
inner: &'a mut T,
marker: PhantomData,
}
Instances of PhantomData
have zero runtime cost, so it's better to use that than to just create a field of type R
.
Another solution would be to use an associated type instead of a type parameter:
trait MyReader {
type Source: Read;
fn new(Self::Source) -> Self;
fn into_inner(self) -> Self::Source;
fn get_next(&mut self) -> Option;
fn do_thingie(&mut self);
}
struct MyIterThing<'a, T: MyReader + 'a> {
inner: &'a mut T,
}
This is a little less flexible as there can only be one choice of Source
per implementation of MyReader
, but it could be sufficient, depending on your needs.