模板实例化疑问

x309374055 2019-06-30 12:12:01

template < class T >
int compare( T a,T b )
{
if( a < b )
return 1;
else if( b < a )
return -1;
else
return 0;
}
int main(int argc,char *argv[] )
{
int a[3]={1,2,3};
int b[3] = {4,5,6};

double a1[3]={1,2,3};
double b1[3] = {4,5,6};
cout << compare( a, b);
cout << compare( a1,b1);
return EXIT_SUCCESS;
}

为啥第一次实例化为 compare<int*>(int *a, int *b),而第二次实例化为comapre<double*>( double *a,double *b )?
返回值不是固定为int吗,实例化为double还可以理解,实例化为double*是为什么?如图:


如果将模板函数改为int compare( T*a,T*b)的话,返回值两次分别为int和double,为啥返回值还是不固定但不为int* 和 double*了?


...全文
76 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Italink 2019-07-01
  • 打赏
  • 举报
回复

那是模板参数

#include<iostream>
#include<sstream>
using namespace std;
template<class T>
T getValue(string s) { //模板参数用作返回值,无法推导
T value;
istringstream is(s);
is >> value;
return value;
}
int main(int argc, char* argv[])
{
double a = getValue<double>("10.12"); //自己提供
return EXIT_SUCCESS;
}

x309374055 2019-06-30
  • 打赏
  • 举报
回复
Ta Tb的时候返回的int*或者double*啊。T *a T*b的时候返回的是int 和double ,你注意看图片箭头指着的地方。
Italink 2019-06-30
  • 打赏
  • 举报
回复
你不是把数组a,b,a1,b1传进去吗,数组退化成指针,模板参数就被推导为对应的类型了,返回值你给的都是int啊
你把函数改为int compare( T*a,T*b),传入实参 compare ( a (int*) , b (int*) ),一对应,模板参数T就是int

x309374055 2019-06-30
  • 打赏
  • 举报
回复
引用 9 楼 Italink的回复:
你圈起来的那个不是返回值,是模板参数
额😓,好尴尬,资料中说返回值如果不能推导出,那么要自己提供,就像我圈起来那样的写法,难道我误解了?
Italink 2019-06-30
  • 打赏
  • 举报
回复
你圈起来的那个不是返回值,是模板参数
x309374055 2019-06-30
  • 打赏
  • 举报
回复
引用 5 楼 真相重于对错的回复:
请把你的问题语言整理好,我怎么看不懂你在说什么?
语言表达能力只能到这种程度,主要就是看图片有箭头的地方和红框的地方。
x309374055 2019-06-30
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错的回复:
返回值类型跟你的模板参数又没关系?
返回值是没关系,但是在变啊,每个实例化返回值都不一定是int
真相重于对错 2019-06-30
  • 打赏
  • 举报
回复
返回值类型跟你的模板参数又没关系?
真相重于对错 2019-06-30
  • 打赏
  • 举报
回复
请把你的问题语言整理好,我怎么看不懂你在说什么?
x309374055 2019-06-30
  • 打赏
  • 举报
回复
引用 3 楼 Italink的回复:
T a, 你传入int * ,T不就是int*么, T* a 你传入 int*,T就是 int啊
我说返回值,返回值是固定的int啊。
Italink 2019-06-30
  • 打赏
  • 举报
回复
T a, 你传入int * ,T不就是int*么, T* a 你传入 int*,T就是 int啊

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧