Я реализую вектор в трехмерном пространстве: {u, v, w}. Я хочу перегрузить оператор *, чтобы была возможна следующая операция: ResultVector = скаляр * Vector . В этом выражении я предположил, что тип, содержащийся в ResVector , является наиболее общим между типом скаляра и типом, содержащимся в Vector . Например, я ожидаю следующих преобразований типов:
int * vector<float> -> vector<float>
complex<float> * vector<float> -> vector<complex>
и так далее. Но я вижу, что моя перегрузка оператора * не работает должным образом. Итак, как мне определить оператор *, чтобы обеспечить преобразование типов, упомянутых выше и других? Скалярный. Более того, оператор * не может использоваться так
Vector3<float> vec1(1, 2, 3);
Vector3<float> vec5(2 * vec1);
, так как соответствующее приведение типов не существует или оператор *, принимающий соответствующие типы, не определен. Но если я определю оператор * следующим образом
template <typename Scalar, typename Multiplier=Scalar>
Vector3<Scalar> operator*(Multiplier number, const Vector3<Scalar>& vec1)
{
Vector3<Scalar> tmp(vec1);
tmp *= number;
return tmp;
}
, тогда возможен вариант использования, упомянутый выше. Зачем? Как это работает?