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

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

Barbara Streisand
Barbara Streisand원래의
2024-11-17 18:40:02314검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.