【发布时间】:2021-08-10 01:08:53
【问题描述】:
我有一个最小的例子如下。
有两个特征,TraitA 和 TraitB。 TraitB 有一个通用函数,它使用 TraitA 作为类型参数。 TraitB 必须是对象安全的,所以我用where Self: Sized 标记函数。到目前为止它运行良好。
如果我有一个结构MyStruct<A: TraitA>,并且我想为它实现TraitB。 impl 块将具有 impl<A: TraitA> TraitB for MyStruct<A>。但是对于generic_func,编译器抱怨A 已经被使用了。我无法编译代码,因为我不知道用什么代替“???”在示例中。
use std::marker::PhantomData;
// One trait
trait TraitA {}
// The other trait that has one generic function that uses TraitA
trait TraitB {
fn generic_func<A: TraitA>(self) where Self: Sized;
}
// TraitB needs to be object safe
fn foo(a: &dyn TraitB) {
}
// The generic struct that uses TraitA, but needs to implement TraitB as well.
struct MyStruct<A: TraitA>(PhantomData<A>);
impl<A: TraitA> TraitB for MyStruct<A> {
// What should I put as ???. It should refer to A.
fn generic_func<???>(self) where Self: Sized {
}
}
【问题讨论】: