2017-04-18 125 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

相关问题