我必须编写一个模板函数,它找到矩阵的最大元素。我试过这个,错误是:
Error 1 error C2664: 'greatest' :
cannot convert parameter 1 from 'int [3][3]' to 'int [][1]'
#include <iostream>
using namespace std;
template<class T>
T greatest(T a[][],int n, int m){
T max = a[0][0];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j] > max)
max = a[i][j];
return max;
}
int main(){
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int max = greatest<int>(a,3,3);
cout << max << endl;
return 0;
}
答案 0 :(得分:3)
您必须指定最后一个数组的长度,如下所示:
template<class T>
T greatest(T a[][3], int n, int m);
改进版本(编译器可以为我们推断):
template<class T, int N>
T greatest(T a[][N], int n, int m); // The function call doesn't change
编辑:
更加改进的版本,不需要长度参数:
template<class T, int N, int M>
T greatest(T (&a)[N][M]);
答案 1 :(得分:2)
为什么在编写模板时明确传递维度?只需将它们设为模板参数,然后让编译器推导出它。您需要通过引用获取数组以防止数组到指针的衰减。
template<class T, int N, int M>
T greatest(T (&a)[N][M]){
T max = a[0][0];
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
if(a[i][j] > max)
max = a[i][j];
return max;
}
并且您在调用T
时也不需要明确指定greatest
。
int max = greatest(a);