我和其他许多人一样,正在编写一个线性代数库供我个人使用。在这样做的过程中,我正在尝试学习更多关于使用C ++编写模板的知识。我有一个类,类似
template<typename T, size_t N, size_t M = N>
class Matrix
{
...
}
现在,我想将某些操作限制为平方矩阵(例如,行列式)。但是当我尝试添加:
T Determinant<T,N,N>();
无法编译,错误为“Missing”;在'&lt;'“之前。我已尝试在行列式调用之上添加另一个模板,但没有任何成功。关于如何实现这一目标的任何建议都将非常感激。
答案 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;
。