Frage

Ich arbeite an einem AVL-Baum. Der Baum selbst scheint zu funktionieren, aber ich brauche einen Iterator durch die Werte des Baumes zu gehen. Deshalb habe ich versucht, die IEnumerator interace zu implementieren. Leider bekomme ich einen Fehler zur Kompilierzeit IEnumerator und IComparable implementieren. Zunächst wird der Code und unten, dass der Fehler.

class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable<T>
{
    private AvlTreeNode<T> current = default(T);
    private AvlTreeNode<T> tree = null;
    private Queue<AvlTreeNode<T>> traverseQueue = null;

    public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree)
    {
        this.tree = tree;

        //Build queue
        traverseQueue = new Queue<AvlTreeNode<T>>();
        visitNode(this.tree.Root);
    }

    private void visitNode(AvlTreeNode<T> node)
    {
        if (node == null)
            return;
        else
        {
            traverseQueue.Enqueue(node);
            visitNode(node.LeftChild);
            visitNode(node.RightChild);
        }
    }

    public T Current
    {
        get { return current.Value; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }

    public void Dispose()
    {
        current = null;
        tree = null;
    }

    public void Reset()
    {
        current = null;
    }

    public bool MoveNext()
    {
        if (traverseQueue.Count > 0)
            current = traverseQueue.Dequeue();
        else
            current = null;

        return (current != null);
    }
}

Der Fehler von VS2008 gegeben: Fehler 1 Der Typ ‚T‘ kann nicht als Typ-Parameter ‚T‘ in der generischen Art oder Methode ‚Opdr2_AvlTreeTest_Final.AvlTreeNode‘ verwendet werden. Es gibt keine Boxen Wandlungs- oder Typ-Parameter Konvertierung von ‚T‘ auf ‚System.IComparable‘.

Dieser Fehler wird in den folgenden Zeilen angegeben:

    //members
    private AvlTreeNode<T> current = default(T);  //current highlighted
    private AvlTreeNode<T> tree = null;   //tree highlighted
    private Queue<AvlTreeNode<T>> traverseQueue = null;   //traverseQueue highlighted  

    //Constructor
    public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree)  // AvlTreePreOrderEnumerator highlighted  
    //Method
    private void visitNode(AvlTreeNode<T> node)   //visitNode highlighted  

Im Moment habe ich nicht den Baum und Knotenlogik enthalten. Ich jemand denkt, dass es notwendig ist, um dieses Problem zu lösen, sagen Sie einfach so!

Thx!

War es hilfreich?

Lösung

Könnten Sie es auf diese

Versuchen Sie,

class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable

Andere Tipps

Ich vermute, dass Sie Ihre Knotenklasse wie folgt deklariert:

public class AvlTreeNode<T> where T : IComparable<AvlTreeNode<T>> {
    public AvlTreeNode<T> Root;
    public AvlTreeNode<T> LeftChild {get;set;}
    public AvlTreeNode<T> RightChild {get;set;}
    public T Value { get; set;}
}

Versuchen Sie, diese (geändert IComparable Parametertyp):

public class AvlTreeNode<T> where T : IComparable<T> {
    public AvlTreeNode<T> Root;
    public AvlTreeNode<T> LeftChild {get;set;}
    public AvlTreeNode<T> RightChild {get;set;}
    public T Value { get; set;}
}

Sie müssen auch Ihr current Feld ändern diese:

private AvlTreeNode<T> current = new AvlTreeNode<T>();

Während Sie haben nicht den eigentlichen Code den Fehler verursacht geschrieben (Opdr2_AvlTreeTest_Final.AvlTreeNode) noch ich das Problem stark vermuten ist, dass Sie diese Klasse in einem allgemeinen Verfahren / Typ verwenden mit einem Typ Parameter, der gezwungen ist nicht IComparable<T> zu implementieren.

Sie können einen ähnlichen Fehler mit einem einfachen Beispiel reproduzieren:

// no problem here at definition site:
void IsLarger<T>(T a, T b) where T : IComparable<T> {
   return a.CompareTo(b) > 0;
}

void Test<T>(T arg) { // note: T is not necessarily IComparable<T>
   Console.WriteLine(IsLarger(arg, arg)); // The compiler shouldn't allow this.
}

Wie bereits ausgeführt, haben Sie den gesamten Code nicht enthalten, aber Sie erzwungener nur T IComparable , während der Fehler, den Sie aufgeführt haben, ist, dass es wollen T IComparable zu implementieren (dh die nicht-generische Form von IComparable)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top