模板矩阵类

时间:2015-07-17 14:23:08

标签: c++ class templates matrix operator-overloading

我的模板类myMatrix主要是:

template<class T, int row, int col>
class myMatrix{
   T *_mat;
public:
   template<int r, int c> using matrix_t = T[r][c];
   myMatrix(const matrix_t<row, col> &);
   myMatrix(const myMatrix<T, row, col> &);
   myMatrix &operator=( const myMatrix<T, row, col>& );
   //...
   // next is the part of * overloading
   myMatrix<T, row, col> operator*(const T& scalar);
   typename< int c2 >
   myMatrix<T, row, c2> operator*( const myMatrix<T, col, c2>& );
   typename< int c2 > 
   myMatrix<T, row, c2> operator*( const matrix_t<col, c2>& );
   typename< int r2 > 
   friend myMatrix<T, r2, col> operator*( const matrix_t<r2, row>&, const myMatrix<T, row, col>& );
   // ...
};

然后我设计了另一个班级Reference

template<int dim, int loop>
class Reference{
    myMatrix<int, dim, loop> _matA;
    myMatrix<int, dim, 1> _matC;
public:
    Reference(const myMatrix<int, dim, loop> &, const Matrix<int, dim, 1> &);
    Reference(const Reference<dim, loop> &);
    Reference<dim, loop> &operator=(const Reference<dim, loop> &);
    // ...
    friend Reference<1, loop> operator*(const Matrix<int, 1, dim> &alpha,
           const Reference<dim, loop> & ref)
    {
       return Reference(alpha * ref._matA, alpha * ref._matC);  // **Problem!!!**
    }
    // ...
};

当我用

之类的东西测试代码时
    const int matA[3][3] = {1,2,3,4,5,6,7};
    const int matC[3][1] = {1,2,3};
    const int alp[][3] = {1,2,2};
    Reference<3,3> ref(matA, matC);
    Matrix<int, 1, 3> alpha(alp);
   // Reference<1,3> ref_t = alp * ref;
    Reference<1,3> ref_t = alpha * ref; // **can not compile!!!**

出现问题:

二进制&#39; *&#39;:找不到哪个运算符采用类型为&#39; const myMatrix&#39;的左手操作数。 (或者没有可接受的转换)......

然后我的问题出现了:

  1. 在班级myMatrix中的所有+4超载中,如果有任何冗余?

  2. 也许只有typename< int c2 > myMatrix<T, row, c2> operator*( const myMatrix<T, col, c2>& );的重载版本可以为以下两个重载提供服务,因为built-in 2d-array like arr[][]由于我的构造函数myMatrix而可以转换为myMatrix(const matrix_t<row, col> &);?< / p>

  3. 编译错误的原因是什么?

1 个答案:

答案 0 :(得分:0)

编译错误说明你做错了什么:

  

二进制&#39; *&#39;:找不到带有&#39; const myMatrix&#39;

类型左手操作数的运算符

你有

operator*(const myMatrix&);

但没有

operator*(const myMatrix&) const;

所以alpha * ref无法匹配(因为alphaconst&)。

实施T::operator*的常用方法是

T& operator*=(const T&);
T operator*(const T&) const;

或者(更好),使*运算符成为具有两个参数的自由函数(如果您可能需要提升左侧参数,这可以更好地工作)。