我有一个定义如下的函数:
template < class T> T doSomething(const T value, const T value2, const T value3)
{
T temp = value;
//Do stuff
return temp ;
}
在我的主要内容中,我将其称为如下:
doSomething(12.0, 23.0f, 2.0f);
我收到一条错误,指出调用doSomething(double, float, float)
没有匹配功能。
我尝试使用const_cast但似乎没有解决问题。任何帮助将不胜感激。
答案 0 :(得分:8)
与const
无关,但T
同时不能同时为double
和float
。
如果您具有非模板功能,则可以将一个或多个参数提升(或转换)为参数类型。使用模板函数,编译器必须首先确定模板类型应该是什么。这里无法决定。
答案 1 :(得分:6)
您的函数定义对三个参数中的每个参数使用相同的类型“T”。 在这种情况下,C ++无法扣除类型。
请选择修复方法:
template<typename A, typename B, typename C> A doSomething(const A& value, const B& value2, const C& value3) { A temp = value; //Do stuff return temp ; }
doSomething<int>(12.0, 23.0f, 2.0f);
doSomething(12.0, static_cast<double>(23.0f), static_cast<double>(2.0f));
答案 2 :(得分:0)
使用模板化功能时,需要在尖括号内提供模板参数。
即。你需要使用doSomething<float>(12.0, 23.0f, 2.0f);
或者,至少,如果不这样做,编译器必须猜测T
是什么,这意味着当它看到第一个参数的double
时,它假定你的意思是{{1} }
答案 3 :(得分:0)
当你这样打电话时:
doSomething(12.0, 23.0f, 2.0f);
然后你基本上让编译器从函数参数中推导出模板参数T
。但在上面的调用中,所有参数的类型都不相同:第一个参数12.0
是double
,而其余两个参数是float
(注意{{1}在f
中{}为2.0f
,而float
为2.0
。)。因此问题是,编译器试图找到一个接受double
作为参数的函数。但是没有这样的功能。并且函数模板不能从参数中推导出来,因为double, float, float
必须与所有参数相同。
因此解决方法是,T
推导为T
或double
:
float
或者这个:
doSomething(12.0f, 23.0f, 2.0f); //all are float now
在第一种情况下,doSomething(12.0, 23.0, 2.0); //all are double now
被推断为T
,而在第二种情况下,float
被推断为T
。
或者,您可以选择不来依赖模板参数推断,方法是将模板参数设置为:
double
或者这个:
doSomething<float>(12.0, 23.0f, 2.0f);
这里,在第一种情况下,第一个参数转换为doSomething<double>(12.0, 23.0f, 2.0f);
,在第二种情况下,第二个和第三个参数转换为float
。