2012-03-20 40 views
2

我在C++中編寫了一個通用的矩陣類。我想能夠從一個二維雙數組中初始化一個矩陣。因爲我正在使用模板,因此在編譯時需要知道矩陣大小,所以我想確保給定大小的數組可以傳遞給構造函數。表示在代碼是這樣的:固定大小的多維數組參數

template<unsigned int M, unsigned int N> 
class Matrix { 
public: 
    Matrix(double (&values)[M][N]); 
} 

現在,來這裏的奇數部分:像預期的下面的代碼工作就像一個魅力:

double arr [3][3] = { {1,2,3}, 
          {1,2,3}, 
          {1,2,3} }; 
    Matrix<3,3>* mat3x3p = new Matrix<3,3>(arr); 

但傳遞數組時,匿名代碼被打破:

Matrix<3,3>* mat3x3p = new Matrix<3,3>({ {1,2,3}, 
             {1,2,3}, 
             {1,2,3} }); 

這同樣適用於施工通過作業。 確切的錯誤信息是:

no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘double (&)[3][3]’ 
+0

嘗試與矩陣(雙(&值)[] [N]);' – 2012-03-20 17:30:37

+0

那沒有工作 – Paranaix 2012-03-20 17:43:15

+0

對不起,我的壞。 '矩陣(const double(&values)[M] [N]);'應該工作。 – 2012-03-20 17:57:15

回答

2

這將綁定一個臨時的(左值)對非const的引用,這是不允許的。如果您更改爲const的引用,那麼這將起作用 - 儘管在數組的情況下,它有點奇怪,因爲限定符適用於元素類型,而不適用於數組本身。不過,如果你有

Matrix(const double (&values)[M][N]); 

然後

Matrix<3, 3>({{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }}) 

是C++ 11有效,這要歸功於列表初始化。我不知道如何使它適用於C++ 03。

+0

有趣的是,當添加一個const限定符修復構造函數問題時,賦值仍然是不可能的 – Paranaix 2012-03-20 17:52:56

+0

@Paranaix當發生這種情況時,總是嘗試添加大括號。即'm = {{{1,2,3}},{4,5,6},{7,8,9}}}'。大括號的新等級是'Matrix <3, 3>',所以相當於'm =矩陣<3, 3> {{1,2,3},{4,5,6},{7,8,9}}'。 – 2012-03-20 17:56:12

+0

不幸的是,這不起作用。我想我應該聲明構造函數「顯式」,以便清楚地知道轉換構造函數是不可能的。 – Paranaix 2012-03-20 18:02:09

1

每C++標準初始化列表只能存在於變量聲明。儘管還有幾行代碼,編譯完第一個示例後應該不會有更多的腳印。