2016-03-11 5 views
0

Пример: даны следующие черты,Можно ли использовать самореферентные связанные типы при использовании дженериков?

trait DirectedAcyclicGraph<V, E> where V: Add, E: Add 

Я хотел бы, чтобы всякий раз, когда значение типа V к значению того же типа, что другое значение типа V возвращается. Всякий раз, когда значение типа E добавляется к другому значению того же типа, я хочу вернуть еще E.

наивности, я думал, что это могло бы быть в правильном направлении,

trait DirectedAcyclicGraph<V, E> where V: Add<Output = V>, E: Add<Output = E> 

, но это было только выстрел в темноте.

Документация Add поставляет следующий пример,

use std::ops::Add; 

struct Foo; 

impl Add for Foo { 
    type Output = Foo; 

    fn add(self, _rhs: Foo) -> Foo { 
     println!("Adding!"); 
     self 
    } 
} 

fn main() { 
    Foo + Foo; 
} 

, но я не могу понять, как обеспечить реализацию для универсального типа таким же образом, если это вообще возможно.

+1

Вы * попробуйте *, что вы думаете, может быть в правильном направлении? Это выглядит правильно для меня. –

+0

Да, не работает. Теперь в клетке. Я могу следить за связанной ошибкой позже –

+0

http://is.gd/9qyS95 –

ответ

0

В результате это было ошибкой программирования. Как @ChrisMorgan указал in his example, выражение Add<Output = V> компилируется. Причина, по которой компилятор вопил, заключалась в том, что в одном месте в исходном коде продукта Output = V не было последовательно добавлено.

К сожалению, я также ошибся при компиляции MWE.

Таким образом, вынос для потомства является то, что

trait DirectedAcyclicGraph<V, E> where V: Add<Output = V>, E: Add<Output = E> 

работы.

 Смежные вопросы

  • Нет связанных вопросов^_^