Сбой перегрузки оператора при объединении операторов? - PullRequest
0 голосов
/ 13 ноября 2018

Я создал собственный класс векторов переменной длины Vec со следующими перегруженными операторами:

float& operator[](int i);
Vec& operator+=(Vec& rhs);
Vec operator+(Vec& rhs);
Vec& operator-=(Vec& rhs);
Vec operator-(Vec& rhs);
Vec& operator*=(float rhs);
Vec operator*(float rhs);
Vec& operator/=(float rhs);
Vec operator/(float rhs);

Эти перегрузки работают индивидуально, и я получаю правильные результаты, но когда я пытаюсь их объединить, я получаю ошибки компиляции с template argument deduction/substitution failed. У кого-нибудь есть идеи почему?

Это работает:

Vec multiplier = d * time;
Vec collision = e + multiplier;

Это не удалось: Vec collision = e + (d * time);

e и d имеют тип Vec, время имеет тип float

1 Ответ

0 голосов
/ 20 ноября 2018

Проблема в том, что вы объявили свои функции как принимающие Vec &rhs аргументы вместо const Vec &rhs. Отсутствие const означает, что вы можете передать только ссылку на реальный (именованный) объект; Вы не можете передать ссылку на неназванный временный объект.

Когда вы «связываете» операции, результатом внутренней операции будет безымянный временный объект, который затем не может быть передан внешней операции, поэтому вы получаете ошибки разрешения перегрузки (которые проявляются как ошибки замены шаблона, как ваш класс видимо на самом деле шаблон)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...