2013-04-02 2 views
2

"C++에서 생각하는"책에서 언급 한 연습 문제 중 하나를 언급하고 있습니다. 코드 스 니펫은 h.play 호출에 대해 오류가 발생합니다. 이해할 수있는 부분은 입니다. 개인.하지만 통화 me.play에 대해 동일한 오류를 기다리고 있었다. 내가 전화를 언급하는 경우는 호출 me.play에 대한 오류가없는 이유는 코드가. 잘 컴파일 h.play?템플릿 쿼리, 개인 멤버에 액세스

class Buddy {}; 

template<class T> class My { 
    int i; 
public: 
    void play(My<Buddy>& s) { 
    s.i = 3; 
    } 
}; 

int main() { 
    My<int> h; 
    My<Buddy> me, bud; 
    h.play(bud); 
    me.play(bud); 
} 

을 감사합니다.

[편집] 컴파일러에서 생성 된 코드를 확인하는 방법이 있습니까

My<int> h and 
My<Buddy> me 

? (-E 컴파일러 플래그와 비슷한 것)?

답변

1

구성원은 동일한 유형의 다른 개체의 인스턴스에 항상 "public"입니다. (예 bud 같은) 다른 My<Buddy> 인스턴스의 전용 부재를 액세스 할 수있는 (예 me 등) My<Buddy> 인스턴스 의미

.

My<int>My<Buddy>과 완전히 다른 유형이므로 해당 구성원을 액세스 할 수 없습니다. play 방식이 아니라보다 My<T>My<Buddy> 참조 복용으로 정의

+0

고마워요. 템플릿 인스턴스에 대해 컴파일러에서 생성 된 코드를 볼 수있는 방법이 있습니까? – irappa

+0

@irappa 불행히도, 나는 그렇게 생각하지 않습니다. – Pubby

0

때문에 효과적인 클래스 My<Buddy>의 다른 인스턴스에서 호출 동일한 유형이다. 따라서 개인 회원은 액세스 할 수 있습니다.

0

강력하고 정적 인 시스템과 제네릭 (자바를보고있는 것)을 가장하는 언어와 달리 C++에서는 매개 변수 (일반적으로 매개 변수 인 유형)를 기반으로 정적으로 매개 변수 유형 (템플릿 유형)을 명확하게 할 수 있습니다. 에 템플릿이 있습니다.

참고 : 정적으로 매개 변수화 된 유형의 매개 변수로 파생 된 (동적/후기 바인딩 된) 유형을 사용할 수도 있지만이 시나리오에서는 관련이 없습니다. C++에서 즉

:

  • typeid(me) == typeid(bud)가 TRUE
  • typeid(h) == typeid(me)이 유형은 "내"동일 할지라도 FALSE

될 것입니다 될 것입니다.

가 공공 것처럼 당신은 에서 같은 유형을 민간 데이터 멤버에 액세스 할 수 있지만, 당신이 볼 수 있듯이, 두 번째 비교는 피연산자 따라서 당신이 위반, 동일한 유형의되지 않기 때문에 거짓 해당 유형의 액세스 제한

또한 컴파일러에서 생성 된 코드를 살펴볼 방법이 없다고 생각합니다. (내가 아는 한)

관련 문제