考虑以下示例:
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:错误:没有匹配函数来调用&#39; applyt&#39;
char r3 = applyt<trunc>(i);
Function.cpp:13:4:注意:候选模板被忽略:模板参数的显式指定参数无效&#39; TO&#39;申请(TI IN){
所以我的问题很简单:输入参数类型很明显 - 一个int - 对我来说应该很明显。
为什么不能推断出TO和TI,但它们可以在r1中推断出来?
答案 0 :(得分:4)
trunc
是一个功能模板,而不是一个类型,因此无法与typename TO
匹配。