我和其他许多人一样,正在编写一个线性代数库供我个人使用。在此过程中,我试图了解有关使用 C++ 模板进行编程的更多信息。我有一个类,内容类似于
template<typename T, size_t N, size_t M = N>
class Matrix
{
...
}
现在,我想将某些运算限制为方阵(例如行列式)。但是当我尝试添加时:
T Determinant<T,N,N>();
编译失败,错误为“Missing ';'”在“<”之前。我尝试在行列式调用上方添加另一个模板,但没有成功。任何有关如何实现这一目标的建议将不胜感激。
最佳答案
不幸的是,您不能像这样专门为特定模板参数指定一个函数,您必须执行整个类。由于您不想重新编码整个事情,因此您可能想使用继承。
//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();
};
关于等参数的 C++ 函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040770/