2013-06-28 35 views
2

當實現一個Matrix4類模板(代表一個4乘4的矩陣)時,我遇到了這個類中的構造函數的問題。我試圖爲多維數組聲明有效的構造函數(,在這種情況下,二維數組又稱爲矩陣),但未能這樣做。這裏是我的構造函數都左值和右值引用多維數組:C++ 11 - 如何爲多維數組的右值引用提供一個有效的構造函數?

Matrix4(T (&matrix_)[4][4]); 
Matrix4(T (&&matrix_)[4][4]); 

這兩個聲明似乎是可以接受的,但調用構造函數以右值引用不能按預期工作:

// Works: 
float matrix__[4][4] = {{0}}; 
Matrix4<float> matrix1__ = matrix__; 

// Does not work: 
Matrix4<float> matrix2__ = { 
    {0, 0, 7, 0}, 
    {1, 0, 5, 0}, 
    {0, 0, 4, 0}, 
    {0, 0, 0, 2} 
}; 

從一段代碼不工作,我得到以下錯誤:

error: could not convert '{{0, 0, 7, 0}, {1, 0, 5, 0}, {0, 0, 4, 0}, {0, 0, 0, 2}}' from '' to 'Matrix4'

那麼,如何提供有效的構造函數右值引用到多二維數組?

回答

3

這是因爲,一類沒有初始化列表構造,一個{ a, b, c }初始化作爲呼叫組構造有三個參數,abc處理。因此,爲了使在另一個{ ... }是佔最外面的大括號

Matrix4<float> matrix2__ = {{ 
    {0, 0, 7, 0}, 
    {1, 0, 5, 0}, 
    {0, 0, 4, 0}, 
    {0, 0, 0, 2} 
}}; 
+0

那麼這種剝離,似乎這樣的伎倆你的榜樣工作,巴掌。非常感謝!我有時討厭C++ 11編譯器似乎更喜歡使用大括號初始化列表而非傳統數組初始化列表。最好習慣這樣的語法。仍然比Matrix4更好 matrix2__ = {.data {...}}; :/ – Helixirr

相關問題