我有2个特征,特征A是特征B的子特征:
pub trait A {...}
pub trait B {...} //A+some methods
对所有非u8都具有自动特征:
pub auto trait IsNotU8 {}
impl !IsNotU8 for u8 {}
用于u8的A的实现:
impl A for Vec<u8> {...}
并且因为对于实现A的所有类型,B中的所有其他方法都无济于事,所以我对实现A的所有类型都实现B:
impl<K: A> B for K {...} //already implemented here
对于Vec:
impl<V: B + IsNotU8> B for Vec<V> {...} //ERROR already implemented
我得到conflicting implementation for `std::vec::Vec<_>`
甚至认为第二种实现仅适用于非u8的值,而第一种实现仅适用于实现A的类型。由于只有Vec实现了A,因此这应该不是问题,因为类型重叠。
为什么会出现此错误?当我不使用为A实现B的间接方式时,此方法有效,但事实并非如此。使用自动特征时,这是编译器中的错误吗?
答案 0 :(得分:0)
虽然在您显示的代码中只有A
的{{1}}实现,但可以稍后添加它,然后您的Vec<u8>
实现会冲突。更一般而言,编译器将始终假定可以在以后添加任何缺少的特征实现(当然,除非您针对某种类型未明确实现的自动特征)。
如果您仍在使用夜间功能,也许可以使用const泛型函数或特征(具有布尔常量)对问题进行建模?