> 백엔드 개발 > C++ > 클래스 템플릿 내의 친구 템플릿 클래스에 대해 별도의 매개 변수가 필요한 이유는 무엇입니까?

클래스 템플릿 내의 친구 템플릿 클래스에 대해 별도의 매개 변수가 필요한 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-17 18:40:02
원래의
273명이 탐색했습니다.

Why Do I Need a Separate Parameter for a Friend Template Class Inside a Class Template?

템플릿 클래스 친구가 있는 클래스 템플릿: 역학 탐구

요소 클래스(BE)를 사용하여 이진 트리(BT) 클래스를 구성한다고 상상해 보세요. )는 다음 구조와 유사한 각 노드를 설명합니다.

template<class T> class BE {
    T *data;
    BE *l, *r;
public:
    template<class U> friend class BT;
};

template<class T> class BT {
    BE<T> *root;
public:
    ...
private:
    ...
};
로그인 후 복사

이 설정에는 이상한 점이 있습니다. 친구를 template로 선언하려고 합니다. 친구 클래스 BT; 실패하면 별도의 매개변수 U(또는 T가 아닌 매개변수)를 사용해야 합니다.

이러한 구별은 템플릿 섀도잉 개념에서 비롯됩니다. 템플릿 매개변수는 중첩된 템플릿 범위 내에서 서로 중복될 수 없습니다. 결과적으로, 중첩된 템플릿에는 다른 매개변수 이름이 필수적입니다.

다음 구성을 고려하십시오.

template<typename T>
struct foo {
  template<typename U>
  friend class bar;
};
로그인 후 복사

여기서 bar는 자체 템플릿 인수에 관계없이 foo에 대한 친구로 선언됩니다. bar, bar, bar 등 bar의 모든 변형은 foo의 인스턴스화와 친구가 됩니다.

반대로 다음 선언은 다음과 같습니다.

template<typename T>
struct foo {
  friend class bar<T>;
};
로그인 후 복사

bar의 템플릿 인수가 foo의 템플릿 인수와 일치하는 경우 bar는 foo의 친구일 뿐임을 암시합니다. 막대 foo의 친구로 간주됩니다.

따라서 특정 시나리오에서는 friend class bar;; 형식을 채택합니다. BE와 BT가 원하는 친구 관계를 효과적으로 구축해야 합니다.

위 내용은 클래스 템플릿 내의 친구 템플릿 클래스에 대해 별도의 매개 변수가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿