Перегрузка оператора c ++ для структуры вектора шаблона - PullRequest
0 голосов
/ 13 марта 2020

Я создаю шаблон Vector<T,n> struct и пытаюсь перегрузить некоторые арифметические c операции. Тем не менее, даже когда я перегрузил операторов, я не получаю ошибок совпадения. Код показан ниже.

В моем файле Vector.hpp есть следующий код:

template <typename T, int n>
struct Vector
{
    T data[n];

    template <typename S>
    Vector<T, n> operator+(Vector<S, n> &vec);

    ...

}

typedef Vector<int, 3> vec3i;

И в Vector.cpp:

template <typename T, int n>
template <typename S>
Vector<T, n> Vector<T, n>::operator+(Vector<S, n> &vec)
{
    T arr[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = this->data[i] + (T)vec->data[i];
    }
    Vector<T, n> result(arr);
    return result;
}

Однако, когда я вызвал этот оператор в main, он не скомпилируется:

int main(int argc, char const *argv[])
{
    vec3i vec1 = Vec3i(1,2,3);
    vec3i vec2 = Vec3i(4,5,6);
    vec3i vec3 =  vec1 + vec2;
    std::cout << vec3.x << "," << vec3.y << "," << vec3.z <<"\n";
    return 0;
}

Вот сообщение об ошибке:

no operator "+" matches these operands -- operand types are: vec3i + vec3i
no match for ‘operator+’ (operand types are ‘vec3i {aka Vector<int, 3>}’ and ‘vec3i {aka Vector<int, 3>}’)GCC
no match for ‘operator+’ (operand types are ‘vec3i {aka Vector<int, 3>}’ and ‘vec3i {aka Vector<int, 3>}’)GCC

Есть идеи о том, что я делаю неправильно?

1 Ответ

0 голосов
/ 13 марта 2020

Поскольку сложение является двоичным оператором, вам необходимо предоставить два аргумента для его перегрузки. Кроме того, если ваш оператор сложения должен быть коммутативным, он должен быть реализован как не член.

Вот рабочий пример:

class X
{
 public:
  X& operator+=(const X& rhs) // compound assignment (does not need to be a member,
  {                           // but often is, to modify the private members)
    /* addition of rhs to *this takes place here */
    return *this; // return the result by reference
  }

  // friends defined inside class body are inline and are hidden from non-ADL lookup
  friend X operator+(X lhs,        // passing lhs by value helps optimize chained a+b+c
                     const X& rhs) // otherwise, both parameters may be const references
  {
    lhs += rhs; // reuse compound assignment
    return lhs; // return the result by value (uses move constructor)
  }
};

, который я бесстыдно украл у здесь .

...