Я разрабатываю проект трассировки лучей. Итак, у меня много векторных операций. Для работы с продуктом я использовал перегрузку оператора и столкнулся с проблемой. Вы можете увидеть подробности ниже:
Эти функции находятся в файле заголовка с именем RayMath.h
//GENERAL INLINES
inline Vector operator*( float c, const Vector& v){ return v * c; } //Func1
inline Vector operator*( const Vector& v1, Vector& v2 ) { return Vector( v1.x * v2.x, v1.y * v2.y, v1.z * v2.z ); } //Func 2
Если я добавлю Func 2
, он даст C2666, more than one operator
для операций, которые используют Func1
. Если я не добавлю Func 2
, я получаю ошибку no operator matches
ошибок. Вот пример использования:
Эти строки находятся в файле .cpp
именем Renderer.cpp
Vector R = ray.direction - 2.f * Dot( ray.direction, N ) * N; //Func1 related
color += trace( Ray( ( intersectionP + R * EPSILON ), R ) ) * sphere->surfaceColor * sphere->reflection; // Func 2 related
Я хотел бы поблагодарить вас за вашу помощь!
Вы уже обнаружили, что конструктор Vector (float) вызывает проблему, поскольку он обеспечивает неявное преобразование из float в вектор. В качестве основного правила вы должны всегда объявлять конструкторы one-arg явно:
explicit Vector(float f): x(f), y(f), z(f)
Vector::Vector(float)
?operator* (const Vector&, float)
перегрузкиoperator* (const Vector&, float)
и неявный конструкторVector::Vector(float)
. Правильно?