我正在用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 :(得分: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 ++标准,初始化列表只能存在于变量声明中。虽然编写了一些代码行,但是一旦编译完第一个示例,就应该没有足够的代码而不是第二个代码。