Как создать перегрузку + на другую сторону - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть матричный класс и перегруженный оператор + работа с другими матрицами и скалярами. Когда я пытаюсь использовать его как mat2 = mat + 3; это работает нормально, но если я изменяю скаляр и матрицу mat2 = 3 + mat; он говорит «Недопустимые операнды в двоичном выражении ('int' и Matrix <3, 4> ')" (3,4 - строки и столбцы в этой матрице). Насколько я понимаю, я не перегружен + для этих случаев, но я не нахожу, как его перегрузить

Matrix operator+(const T &a) {
    Matrix<row, col, T> result;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            result.elements[i][j] = elements[i][j] + a;
        }

    }
    return result;
}

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Эта функция, вероятно, в вашем классе.Но как вы можете добавить перегрузку к int?int даже имеет класс?Пора ли кричать и паниковать?

Сделайте глубокий вдох и посмотрите на разницу между глобальными операторами и операторами-членами перегрузок.Вы действительно можете перегрузить для int в глобальной области видимости, которая, вероятно, будет выглядеть так:

template <typename T>
Matrix<T> operator+(const T &a, Matrix<T> &m) { return m + a; }
1 голос
/ 03 апреля 2019

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

0 голосов
/ 03 апреля 2019

Чтобы иметь возможность использовать

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 ) {
   ...
}
...