2015-06-10 95 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