Rick York
Правые и левые параметры будут иметь тип LeftOp и RightOp, а те-тип Matrix. Вы можете убедиться в этом, посмотрев на код шаблона в списке. Вот два фрагмента :
template< typename T, size_t n, size_t m, typename LeftOp, typename RightOp>
class EtMatrixAdd
{
public:
EtMatrixAdd(const LeftOp& lhs, const RightOp& rhs) :
m_lhs(lhs), m_rhs(rhs) {}
T ElementAt(size_t n, size_t m) const
{
return m_lhs.ElementAt(n, m) + m_rhs.ElementAt(n, m);
}
private:
const LeftOp& m_lhs;
const RightOp& m_rhs;
};
и
// Replaces operator+ of Listing 2
template<typename T, size_t n, size_t m>
inline EtMatrixAdd<T, n, m, Matrix<T, n, m>, Matrix<T, n, m> >
operator + ( const Matrix<T, n, m>& lhs, const Matrix<T, n, m>& rhs )
{
return EtMatrixAdd<T, n, m, Matrix<T, n, m>, Matrix<T, n, m>>( lhs, rhs );
}
Как вы можете видеть во втором фрагменте, оба они относятся к типу :
Matrix<T, n, m>;
Где T-Тип данных, хранящихся в матрице, а n и m-индексы элементов матрицы, которые будут добавлены. Примеры объявления матрицы приведены на первой странице статьи.
Member 13737179
так что даже если я сделаю Matrix<int, 2, 2 >a; Matrix<int, 2, 2 >b; ETMatrixAdd<int 2, 2, a, b>s; это не сработает , некоторые ошибки компиляции тоже. Я добавляю код как листинга-3, так и листинга-1 в один и тот же файл matrix.h. [здесь](https://ideone.com/XBpkbn)
Member 13737179
Я могу сделать для S = A * A; но делая S = A * A * A; бросая ошибку,я реализовал аналогично сложению только разницу, где я просто получаю сумму индексов в i, j для 2 матриц я получаю целую i-ю строку и j-й столбец..а затем умножаю,складываю и возвращаю...но это имеет смысл, почему эта ошибка приходит.. есть какие-нибудь идеи для лучшей реализации ?
Большое спасибо за помощь! :)