关于c++ 模板调用

template<class Tl,class T2,class T3>T1 sum(T2,T3);
  double dl,d2;
  则下列调用中,错误的是
  A)sum<double,double,double>(dl,d2);
  B)sum<double;double>(d1,d2);
  C)sum<double>(d1,d2);
  D)sum(d1,d2);

求大神解释一下

所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
调用代码:

#include <iostream>
using namespace std;
class A
{
public:
template<typename T> void A1(T temp);
template<typename T> A(T temp);

};
template<typename T>
void A::A1(T temp)
{
cout<<temp<<endl;
}
template<typename T>
A::A(T temp)
{
cout<<temp<<endl;
}
template <typename T>
void test(T temp)
{
cout<<temp<<endl;
}

void main()
{
test<int>(12); //普通模板函数
A aa(12); //请注意这一行
aa.A1<int>(15); //成员函数是模板函数

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-05
D应该是错误的。B中的分号应该是笔误吧。

解释如下:
首先template<class Tl,class T2,class T3>T1 sum(T2,T3);这是一个函数声明。它是一个函数模板。函数模板具有参数推导功能,即它可以根据函数参数的类型推导出模板参数的类型。

A:sum<double,double,double>(dl,d2);显示指定T1、T2、T3的类型都是double。无需模板参数推导。无误。
B:sum<double,double>(d1,d2);显式指定模板参数T1、T2的类型是double,而T3类型可以根据函数参数d2推导出来为double。无误。

C:sum<double>(d1,d2);只显示指定T1的类型是double,而T2、T3的类型可以根据d1、d2的类型推导出来为double。无误。
D:sum(d1,d2);没有显示指定T1、T2、T3的类型,虽然T2、T3可以推导出来,但是T1无法进行推导,则在编译时刻发生错误。

故而D应该是错误的。本回答被提问者采纳
第2个回答  2013-01-25
除了D以外,都是错误的。模版函数的调用和普通函数的调用没什么区别。模版函数与普通函数不同的是模版函数的参数列表中的参数类型,是不确定的,只有被调用的时候才能确定,就比如问题中的例子,sum(d1,d2),该调用将模版函数的参数列表中的类型T2和T3实例化为double。普通函数参数列表的参数类型是在函数声明的时候就确定好的。
第3个回答  2013-01-25
B肯定不对,中间不能加分号。
相似回答