C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57073] 템플릿 클래스에서의 프랜드관련
지나가던 학생1 [] 811 읽음    2009-06-01 22:00
지금 성안당서 나온 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에 접근 못할까요?
궁금해서 써봅니다.

+ -

관련 글 리스트
57073 템플릿 클래스에서의 프랜드관련 지나가던 학생1 811 2009/06/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.