c++ 프렌드 operator 재정의의 private 접근 에러에 관한 질문

gyxor의 이미지

이런식으로 friend정의를 클래스 밖에서 하면

#include<iostream> 
using namespace std; 

class tri { 
private : 
int x; 
int y; 

public : 

tri (int a,int b) 
{ 
x = a; 
y = b; 
} 

friend ostream operator<< (ostream os,tri m);

};

ostream operator<< (ostream os,tri m)
{ 
os << "x= " << m.x << " y = " <<m.y << endl ; 
return os; 
} 

void main() 
{ 
tri a(10,20); 
tri b(30,40); 
cout << a << b; 
} 
 

Compiling...
Cpp2.cpp
C:\User\crom\Cpp2.cpp(26) : error C2248: 'x' : cannot access private member declared in class 'tri'
C:\User\crom\Cpp2.cpp(9) : see declaration of 'x'
C:\User\crom\Cpp2.cpp(26) : error C2248: 'y' : cannot access private member declared in class 'tri'
C:\User\crom\Cpp2.cpp(10) : see declaration of 'y'
C:\User\crom\Cpp2.cpp(34) : error C2593: 'operator <<' is ambiguous
Error executing cl.exe.

Cpp2.exe - 3 error(s), 0 warning(s)

이와같이 << 모호성에러와 private 접근 에러가 납니다.

그런데
class tri;
ostream operator<< (ostream os,tri m);

처럼 forward declaration 해주면 에러가 나질 않습니다.

또한 한가지 더 발견한것은요..
ostream operator<< (ostream os,tri m)
{
os << "x= " << m.x << " y = " <<m.y << endl ;
return os;
}
이 내용에서
ostream std::operator<< (ostream os,tri m)
이런 식으로 std:: 를 붙여주게 되면 에러가 나질 않습니다.

또한 friend 의 정의를 클래스 안에서 하게되면 에러가 나질 않습니다.
friend ostream operator<< (ostream os,tri m)
{
os << "x= " << m.x << " y = " <<m.y << endl ;
return os;
}
이런식으로 하게되면 에러없습니다.

friend 의 외부정의시에 에러가 나는것이고 또한 무슨이유로 에러가 없어지는지..
저로서는 이해하기가 어렵습니다.
단순히 정의를 어디다가 했느냐의 문제이지 선언과 정의가분리되더라도 동일한 구문으로 알고있는데요..

위 3가지의 경우에....
무슨 이유때문에 이런 일이 발생하는지 궁금합니다.
알려주시면 감사드리겠습니다.

clhitter의 이미지

Visual C++ 6.0의 버그입니다.
Service Pack을 까세요 SP5가 최신 버젼일 겁니다 )

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.