2017-04-18 95 views
3

請看下面的例子:爲什麼C++編譯器不能推斷模板參數?

template<typename TI> 
char trunc(TI IN){ 
     return (char)IN; 
} 

template <typename TO, typename TI> 
TO applyf(TO (OP)(TI), TI IN){ 
     return OP(IN); 
} 

template <typename TO, typename TI, 
      TO (OP)(TI)> 
TO applyt(TI IN){ 
     return OP(IN); 
} 

int main(){ 
     int i = -21; 
     char r1 = applyf(trunc<int>, i); 
     char r2 = applyt<char, int, trunc>(i); 
     char r3 = applyt<trunc>(i); 
} 

當我用g編譯這段代碼++(用C++ 11),我得到的錯誤:

Function.cpp:21:12: error: no matching function for call to 'applyt'

char r3 = applyt<trunc>(i); 

Function.cpp:13:4: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'TO' TO applyt(TI IN){

所以我的問題很簡單:輸入參數類型是顯而易見的 - 一個int - 對我來說應該是顯而易見的。

爲什麼不能TO和TI被推斷,但他們可以在r1推斷?

+4

編譯器非常明確地表示您正在嘗試將'trunc'與'TO'匹配。該模板有三個參數,而不是一個,並且沒有辦法從操作參數中推斷OP。 – chris

+0

坦率地說,我不確定這個「顯而易見」。 –

+0

哪裏是類型OP定義? – Brandon

回答

4

trunc是一個函數模板,而不是一個類型,所以它不能匹配typename TO

相關問題