在 C++ 中使用类模板函数时缺少下标错误

missing subscript error when using class template functions in c++

提问人:m.a.g 提问时间:5/22/2023 最后编辑:m.a.g 更新时间:5/23/2023 访问量:95

问:

问题

当我尝试递归计算矩阵的行列式时,我收到一个编译错误和两个警告。C2087 'm': missing subscriptC4200 nonstandard extension used: zero-sized array in struct/union

我有一个 Matrix 类,它将矩阵的数据存储在一个 2D 数组中,其中大小由模板参数和 给出。mint rowsint 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;
}
C++ 模板

评论

1赞 Igor Tandetnik 5/22/2023
调用 1x1 矩阵时会发生什么?LaplaceMatrix
1赞 Igor Tandetnik 5/22/2023
另外,请注意,这种计算行列式的方法效率极低。存在更好的算法
2赞 n. m. could be an AI 5/22/2023
“将此矩阵的数据存储在一个联合中” 这结合了未定义行为的所有优点和额外代码复杂性的所有优点。
0赞 Bob__ 5/22/2023
请发布一个最小的可重现示例和您提到的错误的确切文本。
0赞 molbdnilo 5/22/2023
您是否忘记专门研究基本情况 (2x2)?(此外,您应该使小于 2 的大小无效,以及非正方形矩阵。

答: 暂无答案