代码如下:
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'
答案 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
我觉得更干净(将样板移离其他代码)。