矩阵的最大元素,模板函数c ++

时间:2015-04-19 08:54:28

标签: c++

我必须编写一个模板函数,它找到矩阵的最大元素。我试过这个,错误是: 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;
}

2 个答案:

答案 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);