我工作的AVL树。树本身似乎是工作,但我需要一个迭代器通过树的值走路。因此,我试图实现IEnumerator interace。不幸的是,我得到落实的IEnumerator和IComparable的一个编译时错误。第一代码和下面的错误。

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);
    }
}

通过VS2008给出的误差: 错误1型“T”不能被用作在通用类型或方法“Opdr2_AvlTreeTest_Final.AvlTreeNode”类型参数“T”。存在从“T”到“System.IComparable”。

没有装箱转换或类型参数转换

给出对以下行此错误:

    //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  

有关现在我不包括树和节点的逻辑。我认为任何人有必要解决这个问题,只是说!

THX!

有帮助吗?

解决方案

你能尝试改变这种

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

其他提示

我怀疑你宣布你的节点类为这样的:

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;}
}

尝试此(改变IComparable的参数类型):

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;}
}

您也有您current场改成这样:

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

虽然还没有公布实际的代码导致错误(Opdr2_AvlTreeTest_Final.AvlTreeNode)然而,我强烈怀疑的问题是,你是在一个通用的方法/类型与不是限制实施IComparable<T>类型参数使用这个类。

可以再现一个类似的错误用一个简单的示例:

// 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.
}

正如已指出,你有没有包括所有的代码,但只约束吨至了IComparable ,而你所列出的错误是,它要的t若要实现IComparable(即非通用形式IComparable的的)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top