【问题标题】:a function template having a return type, which cannot be deduced from arguments具有返回类型的函数模板,不能从参数推导出
【发布时间】:2012-09-21 18:24:41
【问题描述】:

显式模板参数规范的总结

template<class T>
T max(T t1, T t2)
{
   if (t1 > t2)
      return t1;
   return t2;
}
max<double>(120, 14.55);   we explicitly determine the type of T as double 

我明白上面的部分。

下面,有点不一样

 template<class T>
T SumOfNumbers(int a, int b)
{
   T t = T(); // ???

   t = T(a)+b;  //??? 

   return t;
}

这需要两个整数,并将它们相加。尽管在 int 本身中对它们求和是合适的,但此函数模板提供了根据调用者要求以任何类型计算总和(使用 operator+)的机会。例如,以 double 形式获取结果,您可以将其称为:

double nSum;
nSum = SumOfNumbers<double>(120,200);    //  ???

我了解“显式模板参数规范”主题。但是,这里的条件不同,bcs函数模板的参数类型已经确定了。

我无法理解符号“???”之前的行?

你能一步一步给我解释一下吗?这一行发生了什么

nSum = SumOfNumbers<double>(120,200); 

120 是否将 120.0 即从 int 转换为 double ?

什么 T(a) ?什么意思?

参考: http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

【问题讨论】:

    标签: c++ templates


    【解决方案1】:
    T t = T();
    

    通过值初始化来初始化t。对于内置算术类型,它的值为零;对于用户定义的类型,它使用默认构造函数进行初始化。

    (学究式地,它是通过复制或移动值初始化的临时值来初始化的,因此如果没有可用的复制或移动构造函数,这将失败;实际上复制或移动将被省略)。

    t = T(a)+b;
    

    将a 转换为T,将b 添加到转换后的值,并将结果分配给t。如果T 是内置类型,那么T(a) 将使用标准转换或强制转换;如果它是用户定义的,那么它将使用 T(int) 形式的构造函数。

    第一行没有意义,因为t 将立即被重新分配。函数可以更清楚地写成return T(a)+b;

    nSum = SumOfNumbers<double>(120,200);
    

    这会实例化返回类型为double 的函数模板,然后调用。整体效果和nSum = double(120) + 200;或者nSum = 220.0一样。

    【讨论】:

      【解决方案2】:
      T t = T(); // This creates a new object of type T inefficiently though, I think it actually creates a temporary one and then calls the copy-constructor.
      
      nSum = SumOfNumbers<double>(120,200); // This calls your function with type parameter double with parameter 120 and 200. This means it will compile a version of SumOfNumbers where T is "substituted" by double
      

      T(a) 以int 为参数调用T 的构造函数。

      【讨论】:

      • 我认为,你完全错了,因为你说“这意味着它将编译一个 SumOfNumbers 版本,其中 T 被 double 取代”。参数的类型是确定的,即 int。我从这篇文章中了解到,在这一行:nSum = SumOfNumbers(120,200);使函数的第一个参数的类型为 double 。如果我错了,请告诉我。
      • 我说的是类型参数,就是指T,int是函数参数。 T 是模板类型参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2021-09-21
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多