c++ 프렌드 operator 재정의의 private 접근 에러에 관한 질문
이런식으로 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가지의 경우에....
무슨 이유때문에 이런 일이 발생하는지 궁금합니다.
알려주시면 감사드리겠습니다.
VC bug
Visual C++ 6.0의 버그입니다.
Service Pack을 까세요 SP5가 최신 버젼일 겁니다 )
댓글 달기