Question

I am developing a ray tracing project. So, I have lots of vector operations. For product operation, I used operator overloading, and faced with a problem. You can see the details below:

These functions are in a header file named 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

If I add Func 2, it gives C2666, more than one operator for the operations that use Func1. If I do not add Func 2, I get a no operator matches error. Here is the usage example:

These lines are in a .cpp file named 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

I would like to thank you for your help!

Was it helpful?

Solution

You have already discovered that the Vector(float) constructor causes the problem because it provides an implicit conversion from float to vector. As a basic rule, you should always declare one-arg constructors explicit:

explicit Vector(float f): x(f), y(f), z(f)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top