模板 形参解决方法
模板 形参
程序可以正常运行,此时的T相当于double,那么如果换一种模板的原型,如下
那么此时的T相当于什么呢?还是double吗?
因为编译器内部形参int p[]默认为int *p,难道对于二级指针也是如此,把形参T *arr[]看成T **arr?
------解决方案--------------------
c++ 确定函数模板或函数类型的时候会把所有 array of T 转换为 pointer to T,因此主楼的写法实际上是一样的。最简单的验证方法是把两个函数模板实现同时都写上,看看编译器是不是报重定义的错误。
------解决方案--------------------
应该是 将数组 形参 降级为指针 形参,
如果非得要传入数组的话, 可以这样弄
T* (&array)[n], 这就必须得是数组了, 但问题是 得指定数组元素个数, 可以把这个n放到模版参数中,
而且 array不会在 参数中被降级成为 指针。
- 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不会在 参数中被降级成为 指针。