首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模板 形参解决方法

2012-09-16 
模板 形参C/C++ code#include iostreamusing namespace std template typename TT SumArray(T *arr[]

模板 形参

C/C++ code
#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,那么如果换一种模板的原型,如下
C/C++ code
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?

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

如果非得要传入数组的话, 可以这样弄
T* (&array)[n], 这就必须得是数组了, 但问题是 得指定数组元素个数, 可以把这个n放到模版参数中, 
而且 array不会在 参数中被降级成为 指针。

热点排行