2013-10-31 58 views
1

我用下面的構造函數兩個模板參數的模板類:模板類的明確initializtion

template <class T, class TCompare> 
class MyClass { 
... 
public: 
MyClass(TCompare compare); 
... 
}; 

我有這對於整數比較重載運算符()的結構:

struct IntegerLess { 
    bool operator() {const int& a, const int& b) { 
     if (a < b) 
      return true; 
     return false; 
    } 
}; 

我想將這個結構作爲參數傳遞給MyClass構造函數。我曾嘗試以下:

MyClass<int> myClassObject(IntegerLess()); 

MyClass<int, typename IntegerLess> myClassObject(IntegerLess()); 

不過,兩次我有一個編譯時錯誤。在第一種情況下

error: wrong number of template arguments (1, should be 2) 

,並在第二種情況下

error: template argument 2 is invalid 

有人能說出什麼是正確的選擇嗎?謝謝!

+0

不能推斷*類*模板參數。 –

+0

在第二種情況下,您不需要'typename'。這隻適用於*依賴類型*(即*模板內存在的類型)。 – BoBTFish

回答

2

Number 1是錯誤的,因爲無法推導出類模板參數 - 您必須明確指定它們(除非它們在類模板定義中具有默認值)。

2號只是有一個額外的typename這不應該在那裏。正確的語法是:

MyClass<int, IntegerLess> myClassObject(IntegerLess()); 

而如果IntegerLess是您的實際代碼,而不是你生產的簡化問題,可以考慮使用std::less<int>代替,它不類不正是一個模擬。你甚至可以使之成爲默認的模板參數的類,像這樣:

模板> MyClass類 { 市民: 明確MyClass的(TCompare比較= TCompare()); // ...其餘的如前 };

如果你這樣做,您將能夠以簡單的形式使用它:

MyClass<int> myClassObject;