固定大小的多维数组参数

时间:2012-03-20 17:23:37

标签: c++ arrays templates constructor multidimensional-array

我正在用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]’

2 个答案:

答案 0 :(得分:2)

这会将临时绑定到对非const的(左值)引用,这是不允许的。如果您更改为对const的引用,那么这将起作用 - 尽管在数组的情况下,它有点奇怪,因为 cv -qualifiers适用于元素类型,而不是数组本身。但是,如果你有

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

然后

Matrix<3, 3>({{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }})
由于列表初始化,

在C ++ 11中有效。我不知道如何让它适用于C ++ 03。

答案 1 :(得分:1)

根据C ++标准,初始化列表只能存在于变量声明中。虽然编写了一些代码行,但是一旦编译完第一个示例,就应该没有足够的代码而不是第二个代码。