2014-07-12 3 views
1

사용자 정의 클래스 이진 검색 트리가 있습니다. 비교기 클래스를 인수로 전달하려고합니다 (기본적으로 std :: less 임). 검색된 대부분의 답변은 STL 개체를 사용하고 사용자 지정 비교자를 전달합니다. 나는 다른 것을 원한다.STL처럼 사용자 정의 클래스 용 사용자 정의 비교기

// Tree 클래스

template <class T,class Compare = less<T>> 
class Tree 
{ 
    struct TreeNode 
    { 
     T data; 
     struct TreeNode * left; 
     struct TreeNode * right; 
    }; 
public: 
    void insert(T); 
}; 

// 사용자 정의 비교 클래스

template <class T> 
class CustomCompare 
{ 
public: 
    bool compare(const T&, const T &); 
}; 


template<class T> 
bool CustomCompare<T>::compare(const T & a, const T &b) 
{ 
    cout << "calling custom comparator"; 
    return a<b; 
} 

// 트리에 삽입하는

template<class T,class Compare> 
void Tree<T,Compare>::insert(T val) 
{ 
     // HOW DO I CALL COMPARE HERE? I tried this 
     if (compare(val->data , treeNode->data)) /// does not work. 
     // I get error - use of undeclared identifier compare. 


     //IF I DO THIS, I get error - expected unqualified id 
     Compare<T> x; // cannot create instance of Compare 

     // IF I DO THIS< I can create instance of Compare but cannot call function compare. 
     Compare x; 

     x.compare(....) -- Error no member named compare in std::less 


} 

내가 할 수 없습니다 내가 원하는대로 CustomCompare::compare 정적 코드 std :: less에서도 작동합니다.

나는이 질문이 분명하기를 바랍니다.

참고 : 사용하게 될 클래스에 대해 operator <을 오버로드 할 수 있음을 알고 있습니다. 해당 클래스의 소스 코드를 사용할 수없는 경우 상황에 대비하고 있습니다.

+0

:로

그런 다음, 당신은 그것을 사용할 수 있습니다. – Brian

+0

그럴 경우 오류가 발생합니다. std :: less에서 명명 된 멤버가 없습니다.

답변

1

std::less에는 개체를 비교하는 다음과 같은 기능이 있습니다.

bool operator()(const T& lhs, const T& rhs) const; 

사용자 지정 비교 클래스를 동일 대체물로 사용하려면이 클래스에도 같은 기능이 있어야합니다. 당신은 Compare` '의 인스턴스를 만들 필요가

if (compare()(val->data , treeNode->data)) 
+0

매력처럼 작동했습니다. 고맙습니다. –

+0

@IanMcGrath, 여러분은 환영합니다. –