2014-11-01 153 views
-2

我想乘數組A,B。這些數組的大小是固定的。我推斷他們的大小與模板。現在我想爲C分配一些等於A * B的內存。我的問題是,當我做(N = 3,L = 5)爲多維數組分配內存

int (*C)[N][L] = new int[N][L]

我得到

error: cannot convert ‘int (*)[5]’ to ‘int (*)[3][5]’ in initialization

我做了一個解決方法,但仍然想知道如何在沒有解決方法的情況下執行此操作。

template<int N, int K> 
struct matrix { 
    int array[N][K]; 
}; 

template<int N, int K, int L> 
int (&multiply(int (&A)[N][K], int (&B)[K][L]))[N][L] { 

    matrix<N,L> *mat = new matrix<N,L>(); 
    int (&C)[N][L] = mat->array; 

    return C; 
} 

int main() { 
    int A[3][4]; 
    int B[4][5]; 

    int (&C)[3][5] = multiply(A, B); 
} 

可以使其他解決方案與typedefreinterpreted_cast但爲什麼你需要他們?這就像是C++本身的失敗,語言未能實現所承諾的內容。它類似於Java中的泛型。你認爲像List<T>這樣的容器會更好地瞭解,但他們在鑄造和@SuppressWarnings時也遵循同樣的錯誤方式。

+0

你的「解決方法」看起來像內存泄漏給我。如果你正在創建一個矩陣類,給它正確的值語義。只需實現一個老式的乘法運算符,該運算符需要兩個矩陣並返回一個新的矩陣。 – juanchopanza 2014-11-01 13:16:19

+0

簡單地使用['std :: array'](http://en.cppreference.com/w/cpp/container/array)怎麼樣? – 2014-11-01 13:20:27

+0

類似'std :: array ,N>'會更加優化。 – 2014-11-01 13:20:50

回答

0

問題與

int (*C)[N][L] = new int[N][L]; 

new T[n]返回一個指針T。數組已被分配的事實在返回類型中不可見。因此,表達式new int[N][L]返回一個指針,指向int的大小-L數組。這是你需要的LHS類型:

int (*C)[L] = new int[N][L];