2015-06-10 98 views
0

我想用template来实现一个优先级队列。我试过了但我收到了一些错误,我想通过自定义谓词支持来减少函数的使用。支持谓词的C++模板函数

#include <iostream> 

using namespace std; 

template <typename T, std::size_t N, typename lessFunction> 
class MyClass 
{ 
    typedef std::size_t  size_type; 
public: 
    void push(const T& t) { 
     // 
     size_type index ;//(some value .. say 5) 
     //...// 
     if(lessFunction(m_buffer[index], t)) 
     { 
      /// do something 
     } 
    } 

private: 
    T m_buffer[N]; 
}; 

struct myCompare 
{ 
    bool operator() (int& x, const int& y) { 
     return abs(x) < abs(y); 
    } 
}; 

int main() 
{ 
    MyClass<int , 8, myCompare> obj; 
    obj.push(1); 
    return 0; 
} 

我得到这个错误。

/home/sanju/code/circular-buffer/main.cpp:17: error: no matching function for call to 'myCompare::myCompare(int&, const int&)' 
     if(lessFunction(m_buffer[index], t)) 

请纠正我。我还有一个问题 这个模板如何使用一个函子以及函数lessFunction?

+1

less功能是*类型*。要调用'lessFunction :: operator()',你需要一个*对象*。 –

回答

3

您需要创建该类的实例,然后在推送成员函数中使用overloaded()运算符。

... 
lessFunction f ; 
if (f(m_buffer[index], t)) 
... 

运算符重载函数不是静态成员函数,因此需要声明要调用的类的实例。

+1

我建议,如果你每次调用push函数时都要这样做,那么你使'f'成为一个类成员,所以你不必每次调用函数时都创建它。 – NathanOliver

+0

准确地说,运算符重载函数*不能是静态函数。 – edmz

0

您必须在对象上调用lessFunction::operator(int&, const int&),因为运算符重载函数可能不是静态的。因此,您可以创建它的一个对象,如:

class MyClass 
{ 
    lessFunction comparator; 
}; 

,并在需要的时候,这样调用它:

if (comparator(m_buffer[index], t)) 

您也可以声明为一个局部变量,但你最好保持只是整个班级都可以访问的一个实例。
最后,您可能会考虑使用std::less,可能作为默认的模板参数,以便您不必像myCompare那样重新实现它。

template <typename T, std::size_t N, typename lessFunction = std::less<T>> class MyClass