Hi, I'm confused as to why I'm running into the following problem. It's probably simpler to just show the code. I just don't understand why the resolve
method can't figure itself out.
The actual use case has multiple implementations of Outer
with different generic params in the DB
, hence resolve
references the generics.
Thanks!
#![allow(dead_code)]
use std::marker::PhantomData;
trait Inner<A, B> {
fn do_inner(&self);
}
struct MyInner<A> {
_a: PhantomData<A>
}
impl<A, B> Inner<A, B> for MyInner<A> {
fn do_inner(&self) {
println!("inner");
}
}
struct Outer<A, B, C>
where
C: Inner<A, B>,
{
x: C,
_a: std::marker::PhantomData<A>,
_b: std::marker::PhantomData<B>,
}
impl<A, B, C: Inner<A, B>> Outer<A, B, C> {
fn do_outer(&self) {
println!("outer");
self.x.do_inner();
}
}
struct DB {
outer: Outer<String, usize, MyInner<String>>,
}
impl DB {
fn resolve_subs(&self) -> &Outer<String, usize, MyInner<String>> {
&self.outer
}
fn resolve<A,B,C: Inner<A, B>>(&self) -> &Outer<A, B, C> {
// THIS FAILS TO COMPILE - WHY doesn't it correctly substitute it?
// &self.outer
todo!()
}
}
#[test]
fn do_it() {
let o: Outer<String, usize, MyInner<String>> = Outer { x: MyInner { _a: Default::default() }, _a: Default::default(), _b: Default::default() };
let db = DB {
outer: o,
};
db.resolve_subs().do_outer();
db.resolve().do_outer();
}