|
지금 성안당서 나온 c++기초플러스 보는 학생입니다.
템플릿 부분 보다가 c++빌더로 예제를 테스트 해봣는데 안되서 궁금해서 써봅니다.
일단 코드는 아레와 같습니다.
// frnd2tmp.cpp -- 템플릿이 아닌 프렌드를 가지는 템플릿 클래스
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
class HasFriend
{
private:
T item;
static int ct;
public:
HasFriend(const T & i) : item(i) { ct++; }
~HasFriend() { ct--; }
friend void counts();
friend void report(HasFriend<T> &); // 템플릿 매개변수
};
// 각 특수화는 자신만의 static 데이터 멤버를 가진다
template <typename T>
int HasFriend<T>::ct = 0;
// 모든 HasFriend<T> 클래스에 대해 템플릿이 아닌 프렌드
void counts()
{
cout << "int 카운트: " << HasFriend<int>::ct << "; ";
cout << "double 카운트: " << HasFriend<double>::ct << endl;
}
// HasFriend<int> 클래스에 대해 템플릿이 아닌 프렌드
void report(HasFriend<int> & hf)
{
cout <<"HasFriend<int>: " << hf.item << endl;
}
// HasFriend<double> 클래스에 대해 템플릿이 아닌 프렌드
void report(HasFriend<double> & hf)
{
cout <<"HasFriend<double>: " << hf.item << endl;
}
int main()
{
cout << "선언된 객체 없음: ";
counts();
HasFriend<int> hfi1(10);
cout << "hfi1 선언 후: ";
counts();
HasFriend<int> hfi2(20);
cout << "hfi2 선언 후: ";
counts();
HasFriend<double> hfdb(10.5);
cout << "hfdb 선언 후: ";
counts();
report(hfi1);
report(hfi2);
report(hfdb);
return 0;
}
(코드는 제가 작성한게 아니라 성안당서 받아온 겁니다.)
위 코드를 리눅스 상에서 g++ 4.3으로 해보니 워닝하나 빼곤 잘 됩니다.
근데 빌더로 해보니 counts함수에서 ct에 접근할수가 없다고 에러가 납니다.
그레서 ct를 퍼블릭으로 옮겨주니 잘 되고요.
근데 ct를 퍼블릭으로 해줄꺼면 뭐하러 프렌드를 쓰죠?
왜 프렌드인 counts가 ct에 접근 못할까요?
궁금해서 써봅니다.
|