2014-02-24 5 views
0

광선 추적 프로젝트를 개발 중입니다. 그래서 저는 많은 벡터 연산을합니다. 제품 조작을 위해, 나는 연산자 오버로딩을 사용하고 문제에 직면했다. 아래의 세부 정보를 볼 수 있습니다 :오류 C2666 유사한 오버로딩

이 기능은 내가 Func 2를 추가 할 경우 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 

라는 이름의 헤더 파일에, 그것은 Func1을 사용하는 작업에 대한 C2666, more than one operator 준다. Func 2을 입력하지 않으면 no operator matches 오류가 발생합니다. 다음은 사용 예는 다음과 같습니다

이 라인은 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 

라는 이름의 .cpp 파일에있는 나는 당신의 도움을 주셔서 감사드립니다!

+1

아마도 Vector :: Vector (float) 생성자가 있을까요? – Inspired

+1

짐작하겠습니다. 당신은 또한 과부하'operator * (const Vector &, float)'와 비 명시 적 생성자'Vector :: Vector (float)'를 가지고 있습니다. 권리? – Angew

+0

예,이'Vector (float xVal) : \t x (xVal), y (xVal), z (xVal) {}'생성자가 있습니다. 이 문제가 발생합니까? – ciyo

답변

4

Vector (float) 생성자가 플로트에서 벡터로의 암시 적 변환을 제공하기 때문에 문제가 발생한다는 것을 이미 확인했습니다. 기본 규칙으로, 항상 하나의 arg 생성자를 명시 적으로 선언해야합니다 :

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