2015-11-04 375 views
1
template <typename elemType, typename Comp = less<elemType> > 
class LessThanPred { 
    public: 
     LessThanPred(const elemType &val) : _val(val){} 
     bool operator()(const elemType &val) const 
     { return Comp(val, _val); } 
     void val(const elemType &newval) { _val = newval; } 
     elemType val() const { return _val; } 
private: 
    elemType _val;}; 

這是Essential C++的一個例子。 Comp顯然是一個函數對象類的名字。爲什麼我可以直接使用Comp(val, _val)?通常我想我應該先定義一個這樣的函數對象:Comp comp,然後調用comp而不是Comp功能對象作爲模板參數

+0

比較時,一個類型參數,而不是一個函數對象類名稱。順便說一句,你實際上可以定義一個Comp Comp對象,然後調用comp。 – user2296177

+0

您是否實例化/使用'LessThanPred'的函數調用操作符?由於它是模板成員,因此只有在實例化時才能正確檢查。 –

+0

由於引用不正確,我正在投票結束此題,因爲引用不正確 –

回答

1

由於模板成員在實例化時僅檢查語義正確性,因此編譯代碼。儘管如此,代碼在語法上格式良好。但是,當您嘗試實例化LessThanPred<T>函數調用運算符時,您將收到編譯器錯誤。例如,隨着clang(3.6.1)的版本,我用我得到

less-than.cpp:8:18: error: no matching constructor for initialization of 'std::less<int>' 
     { return Comp(val, _val); } 
       ^ ~~~~~~~~~ 
less-than.cpp:17:25: note: in instantiation of member function 'LessThanPred<int, std::less<int> >::operator()' requested here 
    LessThanPred<int>(2)(1); 

試圖使用功能

LessThanPred<int>(2)(1) 
+0

對於默認情況下,我可以更改代碼'{返回Comp(val,_val); }'到{return Comp()(val,_val); }? – yycfox

+0

@yycfox:是的,創建一個實例應該可以做到。 –