为什么C ++编译器无法推断模板参数?

时间:2017-04-18 01:12:40

标签: c++ c++11

考虑以下示例:

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中推断出来?

1 个答案:

答案 0 :(得分:4)

trunc是一个功能模板,而不是一个类型,因此无法与typename TO匹配。