Предложение: определите 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
путем копирования.