연산자 오버로딩에의 레퍼런스
글쓴이: rasungboy / 작성시간: 수, 2005/02/23 - 3:28오후
template<class T> bool CBuffer::operator<< (T& rhs) { return Write( (const char*)&rhs, sizeof(T) ); } CBuffer buf; buf << (BYTE)0;
어느날 무의식적으로 << 오버로딩에 인자를 레퍼런스로
안넘기고 있던걸 보고 왜 안넘기고 있었나 해서 레퍼런스로
넘기는걸로 고치고(위와같이) 컴파일을 수행했습니다.
그랫더니 에러가 주루룩 나오네요.
대충 vs 7.1 에서는 에러메세지는 아래와 같습니다.
Quote:
no operator found which take a right-hand operator of type 'BYTE'
그런데 아래코드는 잘 작동하는게.....
template<class T> bool CBuffer::operator>> (T& rhs) { return Read( (char*)&rhs, sizeof(T) ); } BYTE value; buf >> value;
이것도 마찬가지로 버퍼에서 데이타를 읽는 것인데
이건 에러가 안나네요..
template<class T> bool operator<< (T rhs); template<class T> bool operator>> (T& rhs);
오래전부터 이렇게 해놓고 사용했다가 요즘 다시 보고
왜 전자는 레퍼런스로 넘기지 않았을까... 그때 무슨이유가
있었던것 같은...(지금과 같은오류)
왜 전자의 경우 레퍼런스로 넘기면 에러가 나는지 궁금하네요..
Forums:
레퍼런스 변수로 쓰이기 위해서는 대입 가능해야 합니다.bool C
레퍼런스 변수로 쓰이기 위해서는 대입 가능해야 합니다.
bool CBuffer::operator<< (T& rhs)
대신에
bool CBuffer::operator<< (const T& rhs)
로 바꾸면 될 듯 싶네요.
참조형은 실제론 포인터로 구현됩니다.
참조형은 실제론 포인터로 구현됩니다.
그런 이유로 상수는 주소가 없으므로 참조형에 대입이 불가능하니, 별도의 변수에 저장한 후 그 변수의 이름을 넘겨주시면 됩니다.
저같은 경우라면 굳이 매개변수를 참조형으로 만들지 않고 (T rhs) 형태로 놓을 듯 하네요.
정수형보다 작은 크기의 매개변수는 굳이 참조형을 통해 주소를 받느니, 값 자체를 받는게 더 좋을테니까요.
만약 T에 대입되는 형이 구조체등의 큰 값이라면 템플릿 선언시 이렇게 처리하겠죠.
님ㅎ 즐~
댓글 달기