繁体   English   中英

显然已经实现特征的类型的冲突特征实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM