模板 形参解决方法

模板 形参
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不会在 参数中被降级成为 指针。