2012-01-23 2 views
50

의 내가 이진 트리, BT을위한 클래스를 만드는거야 가정 해 봅시다, 나는 나무, BE의 요소를 설명하는 클래스,템플릿 클래스 친구가있는 클래스 템플릿, 실제로 진행중인 작업은 무엇입니까?

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: 
... 
}; 
이 일 것으로 보인다

같은 것을 가지고; 그러나 나는 무슨 일이 벌어지고 있는지에 대해 궁금해하고 있습니다.

나는 원래 그러나 그것은 U (또는 T 이외의) 여기,이 이유를 사용할 필요가 나타납니다

template<class T> friend class BT; 

로 친구를 선언하려고? 특정 BT이 특정 BE 클래스의 친구라는 것을 의미합니까?

템플릿 및 친구의 IBM 페이지에는 기능에 대한 다른 유형의 친구 관계가 있지만 클래스에는 해당하지 않는 구문이 있습니다 (구문을 추측하는 것은 아직 솔루션에 수렴되지 않았습니다). 필자가 정의하고자하는 친구 관계의 유형에 대한 올바른 사양을 얻는 방법을 이해하고 싶습니다.

답변

76
template<class T> class BE{ 
    template<class T> friend class BT; 
}; 

템플릿 매개 변수가 서로 음영 처리 할 수 ​​없기 때문에 허용되지 않습니다. 중첩 된 템플릿에는 다른 템플릿 매개 변수 이름이 있어야합니다.


template<typename T> 
struct foo { 
    template<typename U> 
    friend class bar; 
}; 

barfoo의 친구 관계없이 bar의 템플릿 인수 있음을 의미합니다. bar<char>, bar<int>, bar<float> 및 기타 barfoo<char>의 친구가됩니다.


template<typename T> 
struct foo { 
    friend class bar<T>; 
}; 

이것은 bar의의 템플릿 인수는 foo 일치 '의 경우 barfoo의 친구입니다 것을 의미한다. bar<char>foo<char>의 친구가 될 것입니다.


귀하의 경우에는 friend class bar<T>;으로 충분해야합니다. 내 경우

+2

 template <typename _KeyT, typename _ValueT> class hash_map_iterator{ template <typename, typename, int> friend class hash_map; ... 
: 'BT'가 템플릿이 아닙니다. 나중에 선언 된 경우에도 템플릿 클래스 BT { ... } –

+1

비밀은 친구 클래스 BT 을 사용하기 위해 BT 선언을 전달해야 할 필요가 있다는 것입니다. BE의 라인은 아니지만 템플릿의 경우는 친구 클래스 BT; 도와 주셔서 감사합니다! –

+16

더 구체적으로 말하자면'템플릿 class BT;를 선언하고 BE의 정의에 앞서'friend class BT ;'_inside_ 클래스 BE를 사용해야합니다. –

-1

이 솔루션은 제대로 작동 :

template <typename T> 
class DerivedClass1 : public BaseClass1 { 
    template<class T> friend class DerivedClass2; 
private: 
int a; 
}; 

template <typename T> 
class DerivedClass2 : public BaseClass1 { 
    void method() { this->i;} 
}; 

나는 그것이 도움이 될 것입니다 바랍니다. 다른 같은 형 구조체과 친구하기 위해

+5

템플릿 매개 변수를 숨길 때 DerivedClass2의 친구 액세스 권한을 DerivedClass1에 두지 않으면 해당 솔루션이 올바르게 작동하는 방식은 무엇입니까? – kornman00

1

:

template<typename T> 
struct Foo 
{ 
    template<typename> friend struct Foo; 
}; 

template<typename> friend struct Foo; 당신이 쓸 것을 참고 Ttypename/class; 그렇지 않으면 템플리트 parm 섀도 잉 오류가 발생합니다.

+3

답변을 개선하십시오. – swiftBoy

1

이 경우 실패의 적은 포인트를 얻을 수 있도록 매개 변수의 이름을 필요는 없습니다 리팩토링 :

내 코드 친구 클래스 BT 이 건설 친구 라인 오류에 대한 오류가 발생합니다