例如,我有一个功能模板:
template<typename T> void foo(T a, T b, T &c);
如果我将int, double, double
传递给它,该怎么办?在Xcode中,它报告错误。那么这是否意味着我不能为一种模板类型传递不同类型的参数?
在另一种情况下,如果我拨打foo<double>(double, int, int)
,则表示错误。但foo<int>(double, int, int)
会好的。此问题是否与引用类型有关?
答案 0 :(得分:3)
如果没有明确指定类型,则无法传递不同的类型。模板是强类型的,如果类型不完全匹配,类型扣除将失败。
在第一个示例中,您指定了模板类型,因此使用double
foo<double>(T, T, T&)
所以函数作为参数(double, double, double&)
。该示例不起作用,因为编译器不执行基本类型引用的类型转换(即,int n; double& c = n;
或其他方式是非法的),并且您是传递int
作为最后一个参数,该参数无法绑定到double&
引用。
第二个例子
foo<int>(T, T, T&)
没关系,您可以显式指定类型,并使用参数(int, int, int&)
实例化该函数。现在编译器为第一个参数执行所需的转换(double
- 到 - int
);没有为参考执行转换。
答案 1 :(得分:0)
不,当然,T
不能同时是int
和double
。函数参数与您的调用参数不匹配。
答案 2 :(得分:0)
如果模板函数中需要不同的参数类型,请以此为例
template<typename A, typename B, typename C>
void add( A a, B b, C& c ) {
c = static_cast<C>( a + b );
}
如果您正在使用指向对象的指针的模板类型,那么您可能需要使用dynamic_cast。