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