No Matching函数使用const参数调用模板化函数

时间:2012-08-08 16:48:01

标签: c++ gcc

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

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但似乎没有解决问题。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:8)

const无关,但T同时不能同时为doublefloat

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

答案 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.0double,而其余两个参数是float注意{{1}在f中{}为2.0f,而float2.0)。因此问题是,编译器试图找到一个接受double作为参数的函数。但是没有这样的功能。并且函数模板不能从参数中推导出来,因为double, float, float必须与所有参数相同

因此解决方法是,T推导为Tdouble

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