Ошибка C2666 Похожие перегрузки

0

Я разрабатываю проект трассировки лучей. Итак, у меня много векторных операций. Для работы с продуктом я использовал перегрузку оператора и столкнулся с проблемой. Вы можете увидеть подробности ниже:

Эти функции находятся в файле заголовка с именем 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

Я хотел бы поблагодарить вас за вашу помощь!

  • 1
    Может быть, у вас есть конструктор Vector::Vector(float) ?
  • 1
    Позвольте мне угадать - у вас также есть operator* (const Vector&, float) перегрузки operator* (const Vector&, float) и неявный конструктор Vector::Vector(float) . Правильно?
Показать ещё 2 комментария
Теги:
raytracing
operator-overloading

1 ответ

4
Лучший ответ

Вы уже обнаружили, что конструктор Vector (float) вызывает проблему, поскольку он обеспечивает неявное преобразование из float в вектор. В качестве основного правила вы должны всегда объявлять конструкторы one-arg явно:

explicit Vector(float f): x(f), y(f), z(f)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню