2009-08-20 4 views
2

I가 작성한 BinaryTreeNode<T> 클래스 다음 BinaryTree<T> 클래스 Add(T data) 생성 방법을 적용 할 수 없다. 비교 : 연산자 '<'형식의 피연산자 'T'와 'T'

내가 객체 컴파일러의 값을 비교하려고

는 말한다 :

운영자 <가 '형식의 피연산자'T '와'T '에 적용 할 수 없습니다.

예 :

public void AddNode(T data) { 
     BinaryTreeNode<T> node = new BinaryTreeNode<T>(data); 
     BinaryTreeNode<T> temp = root; 

     if (temp.Value < node.Value) // **PROBLEM HERE** 
     ... 

것은 내가 VS08 Express Edition을 사용하고 있습니다.

+0

전화? – cakeforcerberus

답변

8

은을 사용

public class BinaryTree<T> where T : IComparable<T> 
{ 
    private readonly IComparer<T> comparer; 

    public BinaryTree(IComparer<T> comparer) 
    { 
     this.comparer = comparer; 
     ... 
    } 

    public void AddNode(T data) 
    { 
     BinaryTreeNode<T> node = new BinaryTreeNode<T>(data); 
     BinaryTreeNode<T> temp = root; 

     if (comparer.Compare(temp.Value, node.Value) < 0) 

이것은 가장 가까운 :

public class BinaryTree<T> where T : IComparable<T> 
{ 
    public void AddNode(T data) 
    { 
     BinaryTreeNode<T> node = new BinaryTreeNode<T>(data); 
     BinaryTreeNode<T> temp = root; 

     if (temp.Value.CompareTo(node.Value) < 0) 
     ... 

대안이 IComparer<T> 전달하고 사용하는 것입니다 "<"연산자를 보장 할 수 있습니다. 오버로드 된 연산자는 정적이며 형식 인수를 요구하는 형식 인수를 제한 할 방법이 없습니다.

+0

3 시간 전 :-) 물어 봤어야합니다. IComparable 을 구현하는 방법에 대해 설명해 주시겠습니까? –

+0

T 자체가'IComparable '을 구현하지 않는다면 아마도 대신 IComparer 접근법을 사용하고 싶을 것입니다. 구현하는 것이 매우 간단합니다. 주어진 값을 비교하고 음수, 양수 또는 0을 반환합니다. 그 비교에. –

1

T가 될 수있는 유형을 좁히려면 Generic Constraints을 사용하십시오. 그렇게하면 운영자를 통해 비교할 수 있습니다.

순간 T는 임의의 일 수 있습니다. 예를 들어 Car 객체가 있다면 컴파일러는 한 자동차가 다른 자동차보다 "적게"또는 "더 크다"라는 것을 어떻게 알릴 수 있습니까? 그래서 당신은 제약이 필요합니다.

그런 다음 T는 IComparable<T>를 구현해야하도록 제약 조건을 추가한다
+0

감사합니다. 왜 비교할 수 없는지에 대한 의구심을 갖지 않았습니다. (+ 1) –

1

Value의 유형 (int, string, char [], MyClass, YourClass 등)은 '<'연산을 지원하지 않습니다. 즉 대부분의 비 고유 번호 유형, 즉 INT, 긴, 진수 등 정상이

그래서 T 형식의 다른 개체와 비교 될 수 있도록

T가에서 IComparable 클래스를 구현해야

, 당신 함수 선언은 T에 제약 조건을 적용해야합니다

public class BinaryTree<T> where T : IComparable<T> 
{ 
    public void AddNode(T data) 

당신은 무엇이든 T, 그것에서 IComparable을 구현해야합니다 있는지 확인해야합니다. 귀하의 추가 기능에서

public class MyData : IComparable<MyData> 
{ 
    public int CompareTo(MyData other) 
    { 
     // return -1 if 'this' is smaller than other, 0 if equals, 1 otherwise 
    } 
} 

, 당신은 당신이 실제로 "T"라는 이름의 클래스가 있나요

if(temp.Value.CompareTo(node.Value) < 0) 
관련 문제