首页 > 解决方案 > 使用非类型参数时的模板递归

问题描述

我想写一个矩阵类。但是当我想处理行列式函数时,我遇到了麻烦。错误是行列式(下一个)。

template<typename T, int row, int column>
T determinant(const Mat<T, row, column>& current)
{
    if (row == 1) return current[0][0];
    if (row == 2) return current[0][0] * current[1][1] - current[0][1] * current[1][0];
    T sum = 0;
    for (int i = 0; i <= row - 1; i++)
    {
        T sign = 1;
        if (i % 2 == 1) sign = -sign;
        Mat<T, row -1, column - 1> next;
        for (int j = 0, nextRow = 0; j <= row - 1; j++)
        {
            if (i == j) continue;
            for (int k = 0; k <= row - 2; k++)
            {
                next[nextRow][k] = current[j][k + 1];
            }
            nextRow++;
        }
        sum += sign * current[i][0] * determinant(next);
    }
    return sum;
}

标签: c++templatesrecursion

解决方案


我认为您的问题可能与模板递归有关。没有什么能阻止编译器创建无效的 Matrix 类。我认为编译器不会在编译时评估 if 语句。

Mat<T, 0, 0> next;

您可以尝试矩阵类的专业化。这将在编译时停止模板递归。

template<class T, unsigned int rows, unsigned int column>
Mat
{
   public:
   Det()
   {
      //Do recursion and decrement rows
   }
   protected:
   T Data[row][column];
}



template<class T, unsigned int column>
Mat<T,2,column>
{
   public:
   Det()
   {
      return Data[0][0] * Data[1][1] - Data[0][1] * Data[1][0];
   }
   protected:
   T Data[2][column];
}

推荐阅读