Я пытаюсь лучше понять шаблоны и обратился к хорошему классу «ole matrix». Я знаю о себе, броненосец и т. Д. Моя цель - лучше понять шаблоны. Мой вопрос в том, как вы получаете функцию-член для принятия аргумента, который является объектом одного и того же класса шаблонов, но с другой специализацией?Параметр функций-членов класса шаблона
Например, класс матрицы, который я пытаюсь собрать, содержит два параметра шаблона - количество строк и количество столбцов. Кроме того, любая тхп матрица объекта (Matrix<mRows,nCols>
) должен быть в состоянии принять NXP матричный объект (Matrix<nCols,pCols>
) и умножить их вместе и вернуть MXP матричный объект (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 generics). Это означает, что если вы будете использовать этот класс для умножения матриц ([N, M] * [M, K]) с разными размерами, тогда количество сгенерированного кода будет также зависеть от количества уникальных триплетов размеров ([N, M, K]) – antonpp