2015-11-06 82 views
4

我正在处理堆实现。它必须是模板类,我需要它有自己的比较器,通过构造函数传递。我该怎么做?模板类中的比较器

我已经试过这样:

template <typename T> 
class Heap{ 
public: 
    Heap(int size, bool (*comparator) (const T & a, const T & b) = [] (const T & a, const T & b){ 
     return a < b; 
    }) 

    // other unimportant methods 
} 

这对于工程:

Heap<int> heap(4); 

,也为:

Heap<int> heap(4, [](const int & a, const int & b){ return false; }) 

但是当我尝试用这样的指针使用(其中报价是某种结构):

Heap<Offer*> heap2(3, [](Offer const * a, Offer const * b){ 
     return false; 
}); 

我得到这个编译错误:

test.cpp: In function ‘int main()’: 
test.cpp:126:3: error: invalid user-defined conversion from ‘main()::<lambda(const Offer*, const Offer*)>’ to ‘bool (*)(Offer* const&, Offer* const&)’ [-fpermissive] 
    }); 
^
test.cpp:124:59: note: candidate is: main()::<lambda(const Offer*, const Offer*)>::operator bool (*)(const Offer*, const Offer*)() const <near match> 
    Heap<Offer*> heap2(3, [](Offer const * a, Offer const * b){ 
                 ^
test.cpp:124:59: note: no known conversion from ‘bool (*)(const Offer*, const Offer*)’ to ‘bool (*)(Offer* const&, Offer* const&)’ 
test.cpp:13:5: note: initializing argument 2 of ‘Heap<T>::Heap(int, bool (*)(const T&, const T&)) [with T = Offer*]’ 
    Heap(int size, bool (*comparator) (const T & a, const T & b) = [] (const T & a, const T & b){ 

如何使它两种情景工作?

+2

尝试'发售* const的和在不工作的拉姆达的参数'。 – Brahim

+0

或使用仿函数。 – user3063349

+0

函子在某些方面更好吗? – tomascapek

回答

3

对于指针版本:'T'是一个指针,那么它需要作为一个const引用传递 - 它不是它指向的数据,这里是const限定的,但指针引用本身。

template <typename T> 
class Heap{ 
public: 
    Heap(int size, bool (*comparator) (const T & a, const T & b) 
           = [] (const T & a, const T & b){ 
     return a < b; 
    }) {}; 

    // other unimportant methods 
}; 


int main() 
{ 
    Heap<int*> heap2(3, [](int* const& a, int* const& b){ 
     return false; 
    }); 

    // analogous to 
    Heap<int> heap(4, [](const int & a, const int & b){ 
     return false; 
    }); 
    // but it's the pointer to the datum in the first, 
    // and the datum itself in the latter case 
} 

live at Coliru