【发布时间】:2014-11-26 16:57:22
【问题描述】:
我正在努力更好地理解模板,并转向了良好的 'ole 矩阵类。我知道本征、犰狳等。我的目的是更好地理解模板。我的问题是如何让成员函数接受一个参数,该参数是同一模板类的对象,但具有不同的专业化?
例如,我试图组合的矩阵类需要两个模板参数——行数和列数。此外,任何 m x n 矩阵对象 (Matrix<mRows,nCols>) 应该能够获取一个 n x p 矩阵对象 (Matrix<nCols,pCols>) 并将它们相乘并返回一个 m x p 矩阵对象 (Matrix<mRows,pCols>):
template <unsigned mRows, unsigned nCols>
class Matrix
{
private:
double matrixData[mRows][nCols];
//...other stuff
public:
//...other stuff
Matrix operator * (const Matrix<nCols, pCols>& rhs);
}
// simple naive matrix multiplication method
template <unsigned mRows, unsigned nCols>
Matrix<nCols,pCols> Matrix<mRows, nCols>::operator * (const Matrix<nCols,pCols>& rhs)
{
Matrix<nCols,pCols> temp();
for (int r = 0; r<mRows; ++r)
{
for(int c = 0;c<pCols;++c)
{
temp.matrixData[r][c]=0;
for (int elem = 0; elem<nCols;++elem)
{
temp.matrixData[r][c]+= matrixData[r][elem]*rhs.matrixData[elem][c];
}
}
}
return temp;
}
主要功能是这样的:
int main()
{
Matrix<2,3> m1;
Matrix<3,4> m2;
//...initialize matrices...
Matrix<2,4> m3 = m1 * m2;
}
这不起作用,因为 pCols 没有在任何地方声明。应该在哪里/如何声明?
【问题讨论】:
-
我明白这个课程的目的是更好地理解模板。但无论如何,您应该始终记住,编译器会为每个模板参数生成代码(与 java 泛型相反)。这意味着如果您将使用这个类来乘以不同大小的矩阵 ([N, M] * [M, K]),那么生成的代码量也将取决于大小的唯一三元组的数量 ([N, M, K])
标签: c++ templates member-functions