Перегрузка операторов в C ++ - PullRequest
1 голос
/ 21 февраля 2011

http://pastebin.com/Y7SXnrqr

Это компонент более крупного проекта OpenGL.Он определяет трехмерную векторную структуру для использования при выполнении некоторых физических и графических задач в указанной программе.Очевидно, мой профессор может заставить это без проблем скомпилировать в Visual Studio, но когда я пытаюсь скомпилировать его в любой системе, основанной на g ++, это вызывает ошибки.Эти ошибки следующие:

/Point3f.h:67: error: no match for 'operator*=' in '((const Vector3f&)((const Vector3f*)v1)) *= scale'
/Point3f.h:77: error: no match for 'operator+=' in '((const Vector3f&)((const Vector3f*)v1)) += v2'
/Point3f.h:82: error: no match for 'operator-=' in '((const Vector3f&)((const Vector3f*)v1)) -= v2'

Я понимаю, что строки 40-63 перегружают операторы * =, + = и - =.Что меня смущает, так это почему Visual Studio позволяет это компилировать, а G ++ - нет.Есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011
57:  friend Vector3f& operator *= (Vector3f& v1, float scale)
67:  return Vector3f(v1) *= scale;

Нельзя связать временный (в строке 67) неконстантный реф (в строке 57).

Для каждого оператора напишите их как:

struct Vector3f {
    // ...
    Vector3f& operator*=(float scale) {
        // ...
        return *this;
    }
    friend Vector3f operator*(Vector3f v, float scale) {
        return v *= scale;
    }
    friend Vector3f operator*(float scale, Vector3f v) {
        return v *= scale;
    }
0 голосов
/ 21 февраля 2011

Поскольку первые операнды перегруженных функций не являются постоянными.Но они не должны быть (на самом деле, не могут быть).

Но у вас нет копирующего ctor, который используют операторы не-присваивания.Попробуйте добавить копию ctor.

 Vector3f(const Vector3f& rhs):X(rhs.X), Y(rhs.Y), Z(rhs.Z){}

При редактировании: или, может быть, я совершенно не в своей базе.:)

А почему операторы op = пишутся как друзья?Они не должны быть, так как они не симметричны.

...