2012-03-20 41 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++标准初始化列表只能存在于变量声明。尽管还有几行代码,编译完第一个示例后应该不会有更多的脚印。