V: VisibleElement
является предикатом в этом контексте. Проблема в том, что предикат не ограничивает типы в достаточной степени, чтобы V
был как-либо релевантным.
Компилятор видит V
, а также V: VisibleElement
, а затем просто отбрасывает их, потому что они не влияют на:
- какую черту вы реализуете (
impl trait
)
- или тип, для которого вы реализуете черту (
self type
)
- или любое из ограничений одного из них (
predicates
или границы).
Например, если предикат включает в себя отношение между V
и S
, тогда это будет иметь смысл, поскольку оно добавит информацию о том, какие реализации определяются здесь. Например, это может быть что-то вроде этого:
impl<S, V> Storage for Database<S>
where
S: StoredElement<ChildType = V>,
V: VisibleElement,
Я составил здесь типы, так как не знаю, откуда берутся настоящие типы. Это было бы значимым использованием V
, потому что оно ограничивает S
не только StoredElement
, но и StoredElement
s, связанный ChildType
реализует VisibleElement
. Это будет определять только реализацию Storage
для Database
, где выполняется это условие (предикат).
Компилятор жалуется, потому что вы добавили параметр, который не оказывает никакого влияния и который, скорее всего, будет ошибкой с вашей стороны.