Когда вы перегружаете двоичный оператор как функцию-член, экземпляр класса всегда является левым оператором, а аргумент функции - правой рукой, вы ничего не можете сделать, чтобы его изменить. Нет, если вы хотите продолжать использовать только функции-члены.
Но если вы используете глобальную функцию, не являющуюся членом, вы можете легко получить какой бы заказ вы ни пожелали. Например
class Polynomial { ... };
// Function that allows poly * 12.34
Polynomial operator*(const Polynomial& lhs, const double rhs)
{
...
}
// Function which allows 12.34 * poly
Polynomial operator*(const double lhs, const Polynomial& rhs)
{
...
}
И если вы не хотите, чтобы переопределить один и тот же код в обеих функциях, и оператор commutative (например, умножение и сложение должно быть), то вы можете реализовать одну из функции, вызвав другой :
Polynomial operator*(const Polynomial& lhs, const double rhs)
{
...
}
Polynomial operator*(const double lhs, const Polynomial& rhs)
{
return rhs * lhs; // Calls the operator function above
}
конечно, оператор принимает Polynomial
объект, как с левой стороны, конечно, может быть реализован в виде функции-члена.
Относительно примечания, если вы реализовали оператор как функцию-член, например.
class Polynomial
{
...
Polynomial operator*(const double rhs)
{
...
}
};
следующий код
Polynomial poly1(...);
Polynomial poly2 = poly * 12.34;
равен
Polynomial poly1(...);
Polynomial poly2 = poly.operator*(12.34);
Попробуйте использовать [глобальный оператор] (http://stackoverflow.com/questions/1145022/difference-between- глобальный оператор и члены-оператор). – MikeCAT
Это не настоящий код. Хотя можно угадать, что происходит, хороший вопрос предоставит достаточно информации, чтобы люди не могли догадаться. –
@PeteBecker У меня, очевидно, была проблема с замедлением, не хотелось путать людей со слишком большим количеством строк кода для чего-то такого простого. – Gil