[英]How to implement trait for types implementing another trait without conflicting implementations
[英]Conflicting trait implementations for types that clearly already implement the trait
我正在使用 webassembly,所以我需要获取指向缓冲区的指针。 在T
只是AsRef<[f32]>
的情况下(也就是说,如果我理解正确,它可以转换为切片),我已经解决了这个问题:
#[derive(TS, Serialize)]
pub struct PtrBufF32(usize);
impl<T> From<T> for PtrBufF32
where T: AsRef<[f32]>
{
fn from(f32arr: T) -> Self {
let slc: &[f32] = f32arr.as_ref();
let ptr: *const f32 = slc.as_ptr();
Self(ptr as usize)
}
}
我得到了另一个堆栈溢出用户的帮助来了解发生了什么——据我所知,这意味着“对于任何可以转换为&[f32]
的引用的T
(即切片),然后我们可以实现这个特性,结果当然只是指向切片开始的指针。
但是除了实现任何可以表示为&[f32]
的东西之外,我们还需要实现任何可以用&[f32]
表示的东西的集合。 就像,如果我的类型T
实现了Into<&[f32]>
,那么我可以实现任何AsRef<[T]>
的类型,对吧? 等等。 这些的任何集合也实现了它。 所以我认为:
impl<T> From<T> for PtrBufF32
where T: AsRef<[dyn Into<PtrBufF32>]>
{
fn from(f32arr: T) -> Self {
todo!()
}
}
但是不……显然那些是“冲突的实现”?
error[E0119]: conflicting implementations of trait `std::convert::From<memory::ptrbuf::PtrBufF32>` for type `memory::ptrbuf::PtrBufF32`
然而,如果我尝试PtrBufF32::from(vec![T])
和T
实现Into<AsRef<[f32]>>
,它不会让我。 很明显,这并不矛盾,是吗?
谢谢
只要您为未定义的类型列表实现了转换,您就应该考虑得更广泛一些。 想象一下某种类型ForeignType
,它同时实现了Into<PtrBufF32>
和AsRef<[f32]>
。 然后,如果您调用PtrBufF32::from(my_foreign_type)
,编译器无法决定他必须使用两个实现中的哪一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.