연산자 오버로딩에의 레퍼런스

rasungboy의 이미지


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);

오래전부터 이렇게 해놓고 사용했다가 요즘 다시 보고
왜 전자는 레퍼런스로 넘기지 않았을까... 그때 무슨이유가
있었던것 같은...(지금과 같은오류)

왜 전자의 경우 레퍼런스로 넘기면 에러가 나는지 궁금하네요..

cdpark의 이미지

레퍼런스 변수로 쓰이기 위해서는 대입 가능해야 합니다.

bool CBuffer::operator<< (T& rhs)

대신에

bool CBuffer::operator<< (const T& rhs)

로 바꾸면 될 듯 싶네요.

hanzo69의 이미지

참조형은 실제론 포인터로 구현됩니다.

template<class T> 
bool CBuffer::operator<< (T& rhs) 
{ 
    return Write( (const char*)&rhs, sizeof(T) ); 
} 

CBuffer<BYTE> buf; 
BYTE value = 0; 

// 참조형은 실제론 포인터로 구현됩니다. 그러니 상수는 입력 불가죠.
buf << (BYTE)0; 

// 상수를 포인터로 변환 후 참조형에 들어가게 *을 붙이면 
// 컴파일 에러는 안날지 모르지만.. 널 포인터죠-_-;
buf << *((BYTE*)0); 

// 이 경우엔 value라는 변수의 주소값이 스택을 통해 매개변수로 전달될
// 수 있으므로 정상적인 경우죠.
buf >> value; 

그런 이유로 상수는 주소가 없으므로 참조형에 대입이 불가능하니, 별도의 변수에 저장한 후 그 변수의 이름을 넘겨주시면 됩니다.

저같은 경우라면 굳이 매개변수를 참조형으로 만들지 않고 (T rhs) 형태로 놓을 듯 하네요.

정수형보다 작은 크기의 매개변수는 굳이 참조형을 통해 주소를 받느니, 값 자체를 받는게 더 좋을테니까요.
만약 T에 대입되는 형이 구조체등의 큰 값이라면 템플릿 선언시 이렇게 처리하겠죠.

struct Hanzo {
 int i, j;
};

// 아예 참조형을 받게 만든다. 구조체는 상수가 없을테니 위의 BYTE의 
// 경우와 같은 일은 없다. 
CBuffer< Hanzo& > buf;  
Hanzo a, b, c;

buf << a;

님ㅎ 즐~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.