|
전에 VC.NET 2003용으로 제작했던 raytracing프로그램을 BCBuilder로 포팅하려고 했는데..
이상한 에러메세지가 나오더군요..
우선 간단하게 에러메시지가 나오는 부분만 추출해서 간단한 프로그램으로 만들어 보았습니다.
================= vector3.h ====================
#ifndef _VECTOR3_H
#define _VECTOR3_H
#include <math.h>
class vector3
{
public:
double x;
double y;
double z;
vector3() {} // 기본 생성자
vector3(double ix, double iy, double iz) { x=ix; y=iy; z=iz; } // 초기화 생성자(x,y,z값으로..)
// 초기화 생성자 (2개의 vector3로..)
vector3(const vector3 &p1, const vector3 &p2) {x=p2.x-p1.x; y=p2.y-p1.y; z=p2.z-p1.z;}
~vector3() {} // 기본 파괴자
void setXYZ(const double d1, const double d2, const double d3) { x=d1; y=d2; z=d3; }
vector3 normalize() { return (*this) / length(); }
void normalizeSelf() { (*this) = (*this) / length(); }
double length() const { return (double)(sqrt( x*x + y*y + z*z )); } // 벡터의 길이
double lengthSqr() const { return x*x + y*y + z*z; } // 벡터의 길이의 제곱
double operator^(const vector3 &v) const { return (x*v.x + y*v.y + z*v.z); } // 내적 : ^
vector3 operator%(const vector3 &v) const { return vector3( y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x ); } // 외적 : %
vector3 operator*(double a) const { return vector3(x*a, y*a, z*a); } // 벡터 * 실수
vector3 operator/(double a) const { return vector3(x/a, y/a, z/a); } // 벡터 / 실수
vector3 operator+(vector3 &v) const { return vector3(x+v.x, y+v.y, z+v.z); } // 벡터 + 벡터
vector3 operator-(vector3 &v) const { return vector3(x-v.x, y-v.y, z-v.z); } // 벡터 - 벡터
vector3 operator-() const {return vector3(-x,-y,-z); } // -(벡터)
};
#endif
=============== main.cpp ====================================
#include "vector3.h"
#include "stdio.h"
#include "conio.h"
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
vector3 v1(1, 1, 1);
vector3 v2(2, 2, 2);
vector3 v3(3, 3, 3);
//vector3 tmp = v2 + v3; // <-- a
//vector3 v4 = v1 - tmp; //
vector3 v4 = v1 - (v2 + v3); // <-- b
printf("%f, %f, %f", v4.x, v4.y, v4.z);
getch();
return 0;
}
여기까지의 소스를 컴파일하면.. " b " 줄에서..
"[C++ Error] Unit1.cpp(19): E2093 'operator-' not implemented in type 'vector3' for arguments of the same type"
라는 에러 메세지가 나왔습니다..
반면 "b"줄대신 위에 "a"줄로 컴파일하면 에러메시지가 안나오더군요.
임시변수를 사용하고 않하고의 차이일뿐인데 이런 차이가 나는군요..
VC 에서 컴파일해보니 둘다 정상적으로 컴파일됩니다.
원인을 찾던중에...
vector3 operator-(vector3 &v) const { return vector3(x-v.x, y-v.y, z-v.z); } 라는 부분을..
vector3 operator-(const vector3 &v) const { return vector3(x-v.x, y-v.y, z-v.z); }
-----
로 바꾸니 BCBuilder에서도 제대로 컴파일 되는군요..
◆ 여기서 질문입니다!
임시변수를 사용하지 않고 연산자를 겹쳐서 사용하는경우..
안에 위치한 연산자의 결과는 const형이 되는건가요?
(v2 + v3)의 결과가 const vector3형이 되는건가 하는겁니다.
두번째로.. VC와 BCBuilder중에서 표준에 따르는게 어떤것인지 궁금합니다..
(C++책을 보면 보통 연산자 오버로딩할때 변수부분에 const를 넣는 예제가 많은걸로 보면
BCBuilder가 표준인거 같긴합니다만..)
검색해볼려다가 검색기능이 안되서 질문드렸습니다..
귀찮으시더라도 답변 부탁드립니다~~ ^^;;
|