C ++函数专用于相等参数

时间:2011-11-07 18:18:03

标签: c++ templates matrix overloading template-specialization

我和其他许多人一样,正在编写一个线性代数库供我个人使用。在这样做的过程中,我正在尝试学习更多关于使用C ++编写模板的知识。我有一个类,类似

template<typename T, size_t N, size_t M = N>
class Matrix
{
    ...
}

现在,我想将某些操作限制为平方矩阵(例如,行列式)。但是当我尝试添加:

T Determinant<T,N,N>();

无法编译,错误为“Missing”;在'&lt;'“之前。我已尝试在行列式调用之上添加另一个模板,但没有任何成功。关于如何实现这一目标的任何建议都将非常感激。

4 个答案:

答案 0 :(得分:4)

不幸的是,您无法专门为特定模板参数设置函数,您必须完成整个类。由于您不想重新编写整个代码,因此您可能希望使用继承。

//shared code
template<typename T, size_t N, size_t M>
class BaseMatrix
{
    //existing code
};

// non-square general case
template<typename T, size_t N, size_t M=N>
class Matrix : public BaseMatrix<T,N,M>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
};

//square matrix specialization
template<typename T, size_t N>
class Matrix : public BaseMatrix<T,N,N>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
    T Determinant();
};

答案 1 :(得分:3)

  

现在,我想将某些操作限制为方形矩阵(例如,行列式)。

你的意思是这样的免费功能:

template< typename T, std::size_t N >
T determinant( Matrix< T, N, N > const& m ){ ... }

或者你是说它是班级成员?如果您需要类成员,那么最好将所有常用功能移动到基类,并在Matrix上使用模板专门化来包含方形矩阵的额外功能。

答案 2 :(得分:0)

我支持基类的想法。有一个Matrix类和一个SquareMatrix子类。在SquareMatrix类中声明Determinant方法并安全地假设矩阵是正方形而不必处理模板。行列式方法将更简单,因此将调用它的代码。

答案 3 :(得分:-3)

你必须声明一个这样的变量:Matrix<float, 10, 10> myMatrix;