2015-04-19 92 views
0

我必須編寫一個模板函數,它可以找到矩陣的最大元素。我嘗試這樣做,錯誤是: Error 1 error C2664: 'greatest' : cannot convert parameter 1 from 'int [3][3]' to 'int [][1]'矩陣的最大元素,模板函數C++

#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

嘗試使用'** a'而不是'a [] []'。 –

+0

@OlegVaskevich 我試過了,但如果函數的第一個參數是** a,如何在main中定義將是矩陣和類型** a的變量? – wdc

回答

3

您必須指定數組最後的像這樣的長度:

​​

改進版本(編譯器可以推斷出這一點對我們來說):

template<class T, int N> 
T greatest(T a[][N], int n, int m); // The function call doesn't change 

編輯:

更改進版本,WHI ch不需要長度參數:

template<class T, int N, int M> 
T greatest(T (&a)[N][M]); 
+0

但是用'template '函數返回一些地址,而不是最大的int。 – wdc

+1

你的代碼有一個小小的錯誤:應該是'cout << max << endl;' – ligoore

+0

我總是忽略了這一點,謝謝。 – wdc

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; 
} 

,並呼籲greatest當任你並不需要顯式地指定T

int max = greatest(a);