使用模板构造函数,模板参数演绎/替换失败,为什么?

时间:2014-04-07 02:34:13

标签: c++ templates

代码如下:

template<typename T>
struct ST{
ST();
ST(T t){}
};
template<typename T>
void fun(ST<T> t, T a){
}

int main(int argc, char * argv[])
{
  ST<int> t=2;
   fun(2,2);
}

使用g ++ 4.8.2编译 errinfo:

  

没有匹配的乐趣(int,int)

     

候选人是:

     

模板void fun(ST,T)

     

模板参数扣除/替换失败:

     

不匹配的类型'ST'和'int'

3 个答案:

答案 0 :(得分:2)

隐式类型转换不用于推断模板参数,在这种情况下您必须手动指定类型fun<int>(2,2);

答案 1 :(得分:1)

您的功能签名为void fun(ST<T> t, T a),但您使用fun(int, int)调用该功能。就像你的错误所说的那样,这些都不匹配。如果fun的类型扣除为int,则签名将如下:fun(ST<int> t, int a),您可以使用fun(t, 2)调用。

答案 2 :(得分:1)

尝试:

template<class T>struct identity{typedef T type;};
template<class T>void fun(typename identity<S<T>>::type s, T t)

这将阻止编译器尝试对第一个参数进行参数类型推导。

template类型匹配是模式匹配。很少有转换完成,因为在一般情况下无法解决(有T这样X<T>可以从类型Z转换为图灵完成到任意限制{ {1}}编译器:递归深度等)。

在C ++ 11中,你可以这样做:

template

我觉得更干净(将样板移离其他代码)。