конфликтующая реализация для `std :: ve c :: Ve c <_>` при использовании автоматических признаков - PullRequest
1 голос
/ 20 февраля 2020

У меня есть 2 черты, черта A является подтрейтом для черты B:

pub trait A {...}
pub trait B {...} //A+some methods

И автотрейт для всего, что не u8:

pub auto trait IsNotU8 {}
impl !IsNotU8 for u8 {}

Реализация A для u8:

impl A for Vec<u8> {...}

И поскольку для всех типов, реализующих A, все остальные методы в B ничего не делают, я реализую B для всех типов, реализующих A:

impl<K: A> B for K {...} //already implemented here

И для Ve c :

impl<V: B + IsNotU8> B for Vec<V> {...} //ERROR already implemented

Я conflicting implementation for `std::vec::Vec<_>` даже подумал, что вторая реализация работает только для значений, не являющихся u8, а первая реализация предназначена только для типов, реализующих A. Поскольку только Ve c реализует A, это не должно быть проблемой, потому что ни один из типов не перекрывается.

Почему я получаю эту ошибку? Когда я не использую косвенную реализацию B для A, это работает, но с этим нет. Это ошибка в компиляторе при использовании автоматических черт?

1 Ответ

0 голосов
/ 02 марта 2020

Хотя в показанном вами коде есть только A реализация для Vec<u8>, ее можно добавить позже, и тогда ваши B реализации будут конфликтовать. В более общем случае, компилятор всегда будет предполагать, что любая реализация отсутствующей черты может быть добавлена ​​позже (за исключением, конечно, вашего случая автоматической черты, которая явно не реализована для некоторого типа).

Если вы используете ночные функции в любом случае, может быть, ваша проблема может быть смоделирована с помощью функции или черты const generi c (с логической константой)?

...