Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
固定大小的多维数组参数 我在C++中编写一个泛型矩阵类。我希望能够从二维双数组初始化矩阵。因为我使用的是模板,因此需要在编译时知道矩阵的大小,所以我希望确保只将给定大小的数组传递给构造函数。以代码表示,这是: template<unsigned int M, unsigned int N> class Matrix { public: Matrix(double (&values)[M][N]); } 模板 类矩阵{ 公众: 矩阵(双(&值)[M][N]); }_C++_Arrays_Templates_Constructor_Multidimensional Array - Fatal编程技术网

固定大小的多维数组参数 我在C++中编写一个泛型矩阵类。我希望能够从二维双数组初始化矩阵。因为我使用的是模板,因此需要在编译时知道矩阵的大小,所以我希望确保只将给定大小的数组传递给构造函数。以代码表示,这是: template<unsigned int M, unsigned int N> class Matrix { public: Matrix(double (&values)[M][N]); } 模板 类矩阵{ 公众: 矩阵(双(&值)[M][N]); }

固定大小的多维数组参数 我在C++中编写一个泛型矩阵类。我希望能够从二维双数组初始化矩阵。因为我使用的是模板,因此需要在编译时知道矩阵的大小,所以我希望确保只将给定大小的数组传递给构造函数。以代码表示,这是: template<unsigned int M, unsigned int N> class Matrix { public: Matrix(double (&values)[M][N]); } 模板 类矩阵{ 公众: 矩阵(双(&值)[M][N]); },c++,arrays,templates,constructor,multidimensional-array,C++,Arrays,Templates,Constructor,Multidimensional Array,现在,奇怪的部分来了:正如预期的那样,以下代码工作起来很有魅力: double arr [3][3] = { {1,2,3}, {1,2,3}, {1,2,3} }; Matrix<3,3>* mat3x3p = new Matrix<3,3>(arr); double-arr[3][3]={{1,2,3}, {1,2,3}, {1,2,3} }; 矩

现在,奇怪的部分来了:正如预期的那样,以下代码工作起来很有魅力:

    double arr [3][3] = { {1,2,3},
                          {1,2,3},
                          {1,2,3} };
    Matrix<3,3>* mat3x3p = new Matrix<3,3>(arr);
double-arr[3][3]={{1,2,3},
{1,2,3},
{1,2,3} };
矩阵*mat3x3p=新矩阵(arr);
但当匿名传递数组时,代码被破坏:

Matrix<3,3>* mat3x3p = new Matrix<3,3>({ {1,2,3},
                                         {1,2,3},
                                         {1,2,3} });
Matrix*mat3x3p=新矩阵({1,2,3}),
{1,2,3},
{1,2,3} });
这同样适用于通过转让进行的施工。 确切的错误消息是:

no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘double (&)[3][3]’
参数1从“”到双(&)[3][3]的转换未知

< C++ >标准化初始化列表只能在变量声明中存在。虽然多了几行代码,但一旦编译完成,第一个示例应该不会比第二个示例有更多的脚印。

这将把临时绑定到非常量的(左值)引用,这是不允许的。如果您更改为对
const
的引用,那么这将起作用——尽管对于数组来说,cv限定符应用于元素类型而不是数组本身有点奇怪。尽管如此,如果你有

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

矩阵({1,2,3},{4,5,6},{7,8,9})

由于列表初始化,在C++11中有效。我不知道如何让它在C++03上工作。

尝试使用
Matrix(double(&value)[[N])矩阵(常数双(&value)[M][N])应该可以工作。有趣的是,虽然添加常量限定符可以解决构造函数问题,但赋值仍然不可用possible@Paranaix当这种情况发生在您身上时,请始终尝试添加一级大括号。也就是说,
m={{{{1,2,3},{4,5,6},{7,8,9}}
。大括号的新级别用于
矩阵
,因此这相当于
m=矩阵{{1,2,3}、{4,5,6}、{7,8,9}
。不幸的是,这不起作用。我想我应该将构造函数声明为“显式”,这样就可以清楚地知道转换构造函数是不可能的@这可能意味着您已经达到了编译器的极限。您是否尝试过显式编写
运算符=
常量int(&)[M][N]
Matrix<3, 3>({{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }})