4

我有一个定义如下的函数:

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);

我收到一条错误消息,提示 call 没有匹配的函数doSomething(double, float, float)

我尝试使用 const_cast 但它似乎没有解决问题。任何帮助,将不胜感激。

4

4 回答 4

8

这不是关于const,而是关于那个T不能同时是double两者float

如果您有非模板函数,则可以将一个或多个参数提升(或转换)为参数类型。使用模板函数,编译器必须首先确定模板类型应该是什么。在这里它无法决定。

于 2012-08-08T16:50:29.110 回答
6

您的函数定义对三个参数中的每一个都使用相同的类型“T”。在这种情况下,C++ 无法扣除类型。

请选择修复方式:

  • 每个参数的不同类型
    模板<类型名 A,类型名 B,类型名 C>
    A doSomething(const A& value, const B& value2, const C& value3)
    {
        温度=值;
        //做东西
        返回温度;
    }
  • 调用时显式模板参数:
    doSomething<int>(12.0, 23.0f, 2.0f);
  • 调用参数的显式类型转换:
    doSomething(12.0, static_cast<double>(23.0f), static_cast<double>(2.0f));
于 2012-08-08T17:01:50.643 回答
0

使用模板化函数时,您需要在尖括号内提供模板参数。

即你需要使用doSomething<float>(12.0, 23.0f, 2.0f);

或者,至少,如果你不这样做,编译器必须猜测是什么T,这意味着当它看到double第一个参数的 a 时,它假设你的意思是doSomething<double>()

于 2012-08-08T16:50:39.003 回答
0

当你这样打电话时:

doSomething(12.0, 23.0f, 2.0f);

然后你基本上让编译器T从函数参数中推断出模板参数。但是在上面的调用中,所有参数的类型都不相同:第一个参数12.0double,而其余两个参数是float注意fin2.0f 使它成为 a float,while2.0是 a double.)。因此出现了问题,因为编译器试图找到一个接受double, float, float作为参数的函数。但是没有这样的功能。并且函数模板不能从参数中推导出来,因为所有参数T都必须相同

所以解决方案是,让我们T推断为doubleor 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,在第二种情况下,第二个和第三个参数转换为double

于 2012-08-08T17:00:15.730 回答