提问人:m.a.g 提问时间:5/22/2023 最后编辑:m.a.g 更新时间:5/23/2023 访问量:95
在 C++ 中使用类模板函数时缺少下标错误
missing subscript error when using class template functions in c++
问:
问题
当我尝试递归计算矩阵的行列式时,我收到一个编译错误和两个警告。C2087 'm': missing subscript
C4200 nonstandard extension used: zero-sized array in struct/union
我有一个 Matrix 类,它将矩阵的数据存储在一个 2D 数组中,其中大小由模板参数和 给出。m
int rows
int columns
注意:我已经研究了另一篇关于缺少下标 c++ 的帖子,但它并没有完全回答我的问题,因为我的 2D 数组的大小由模板参数定义并且不留空。
法典
这是我的 MRE 产生错误,内置于 Visual Studio 2019 中:
矩阵.h
#include <iostream>
#include <assert.h>
template <typename T, int rows, int columns>
struct Matrix
{
private:
const int size = rows * columns;
union
{
T m[rows][columns];
T a[rows * columns];
};
public:
Matrix()
{
for (int i = 0; i < size; ++i)
a[i] = T(0);
}
Matrix(T* a_)
{
for (int i = 0; i < size; ++i)
a[i] = a_[i];
}
T& operator[](int index)
{
return a[index];
}
Matrix<T, rows - 1, columns - 1> LaplaceMatrix(int row, int column)
{
Matrix<T, rows - 1, columns - 1> res;
int index = 0;
for (int i = 0; i < rows; ++i)
{
if (i == row)
continue;
for (int j = 0; j < columns; ++j)
{
if (j == column)
continue;
res[index] = m[i][j];
++index;
}
}
return res;
}
T Determinant()
{
assert(rows == columns);
if (rows == 2)
return m[0][0] * m[1][1] - m[0][1] * m[1][0];
T determinant = T(0);
for (int i = 0; i < size; ++i)
{
if (m[0][i] != 0)
{
if (i % 2 == 0)
{
Matrix<T, rows - 1, columns - 1> laplace = LaplaceMatrix(0, i);
T det = laplace.Determinant();
determinant += (m[0][i] * det);
}
else
{
Matrix<T, rows - 1, columns - 1> laplace = LaplaceMatrix(0, i);
T det = laplace.Determinant();
determinant -= (m[0][i] * det);
}
}
}
return determinant;
}
};
主 .cpp
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Matrix<int, 3, 3> m(a);
Matrix<int, 2, 2> laplace = m.LaplaceMatrix(0, 0);
std::cout << laplace.Determinant() << std::endl;
return 0;
}
答: 暂无答案
上一个:具有约束条件的模板类友谊
评论
LaplaceMatrix