如何在另一侧创建重载+

时间:2019-04-03 19:47:09

标签: c++ oop templates operator-overloading

我有矩阵类和重载运算符+与其他矩阵和标量一起工作。当我尝试使用它时,例如mat2 = mat + 3;可以,但是如果我更改标量和矩阵mat2 = 3 + mat;它说“二进制表达式('int'和Matrix <3,4>')的无效操作数”(3,4是此矩阵中的行和列)。 我的理解是在这种情况下我并没有超载,但是我找不到如何超载

$a->getB()->getA() ...

3 个答案:

答案 0 :(得分:2)

该功能可能在您的课程中。但是如何为int添加重载呢? int甚至拥有一类吗?是时候尖叫和惊慌了吗?

深吸一口气,看看difference between global operator and member operator超载。实际上,您可以在全局范围内为int重载,看起来可能像这样:

template <typename T>
Matrix<T> operator+(const T &a, Matrix<T> &m) { return m + a; }

答案 1 :(得分:1)

建议:将operator+=()定义为该类的成员函数,但将operator+()定义为几个外部函数(如果需要,可以将friend定义为该类)。也许使用operator+()方法定义operator+=()函数,以避免代码重复。

类似(警告:未经测试的代码,并且假设Matrix具有复制构造函数)

// method of the Matrix class
Matrix operator+= (T const & a)
 {
   for ( auto i = 0 ; i < row ; ++i )
      for ( auto j = 0 ; j < col ; ++j ) 
          elements[i][j] += a;

    return *this;
 }

// ordinary (external to the Matrix class) function
template <int row, int col, typename T>
Matrix<row, col, T> operator+ (Matrix<row, col, T> m, T const & a)
 { return m += a; }

// ordinary (external to the Matrix class) function
template <int row, int col, typename T>
Matrix<row, col, T> operator+ (T const & a, Matrix<row, col, T> m)
 { return m += a; }

观察到两个operator+()都收到副本的Matrix值。

答案 2 :(得分:0)

为了能够使用

mat2=3+mat;

您必须将运算符作为非成员函数重载。幸运的是,它的实现非常简单。

template <typename T>
Matrix<T> operator+(const T &a, Matrix<T> const& mat) {
    return (mat + a);
}

理想情况下,您应该将两个版本都重载为非成员函数。

template <typename T>
Matrix<T> operator+(Matrix<T> const& mat, const T &a ) {
   ...
}