模板 形参

南气子水 2012-09-09 10:06:33
#include <iostream>
using namespace std;
template <typename T>
T SumArray(T *arr[], int n);

int main()
{
double *pd[3];
double x1 = 9.4, x2=9.0,x3=8.9;
pd[0] = &x1;
pd[1] = &x2;
pd[2] = &x3;

cout<<SumArray(pd, 3)<<endl;

return 0;
}

template <typename T>
T SumArray(T *arr[], int n)
{
T sum=0;
for(int i=0; i<n; i++)
{
sum = sum + *(arr[i]);
}
return sum;
}

程序可以正常运行,此时的T相当于double,那么如果换一种模板的原型,如下
template <typename T>
T SumArray(T **arr, int n)
{
T sum=0;
for(int i=0; i<n; i++)
{
sum = sum + *(arr[i]);
}
return sum;
}

那么此时的T相当于什么呢?还是double吗?
因为编译器内部形参int p[]默认为int *p,难道对于二级指针也是如此,把形参T *arr[]看成T **arr?
...全文
187 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmu_才盛 2012-09-10
  • 打赏
  • 举报
回复
应该是 将数组 形参 降级为指针 形参,

如果非得要传入数组的话, 可以这样弄
T* (&array)[n], 这就必须得是数组了, 但问题是 得指定数组元素个数, 可以把这个n放到模版参数中,
而且 array不会在 参数中被降级成为 指针。
南气子水 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

c++ 确定函数模板或函数类型的时候会把所有 array of T 转换为 pointer to T,因此主楼的写法实际上是一样的。最简单的验证方法是把两个函数模板实现同时都写上,看看编译器是不是报重定义的错误。
[/Quote]

试了下,的确是重定义
ri_aje 2012-09-10
  • 打赏
  • 举报
回复
c++ 确定函数模板或函数类型的时候会把所有 array of T 转换为 pointer to T,因此主楼的写法实际上是一样的。最简单的验证方法是把两个函数模板实现同时都写上,看看编译器是不是报重定义的错误。
thz1598746 2012-09-09
  • 打赏
  • 举报
回复
看看楼下怎么说。。。

65,186

社区成员

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

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