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