模板class朋友的类模板,这里究竟发生了什么?

比方说,我正在为一棵二叉树BT创build一个类,并且我有一个类来描述树的一个元素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: ... }; 

这似乎工作; 不过,我对下面发生的事情有疑问。

我原本试图宣布朋友为

 template<class T> friend class BT; 

但是这里有必要使用U (或T以外的东西),这是为什么呢? 这是否意味着任何特定的BT对任何特定的BE类都是朋友?

模板和朋友的IBM页面上有不同types的函数但不包括类的朋友关系的示例(并且猜测语法还没有收敛到解决scheme)。 我宁愿了解如何获得我希望定义的朋友关系types的规格。

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

不允许,因为模板参数不能互相影响。 嵌套模板必须具有不同的模板参数名称。


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

这意味着无论bar的模板参数如何, bar都是foo的朋友。 bar<char>bar<int>bar<float>和任何其他的bar将是foo<char>朋友。


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

这意味着当bar的模板参数与foo匹配时, barfoo的朋友。 只有bar<char>会是foo<char>一个朋友。


在你的情况下, friend class bar<T>; 应该足够了。

没有必要给参数命名,所以如果重构的话会得到更less的失败点:

  template <typename _KeyT, typename _ValueT> class hash_map_iterator{ template <typename, typename, int> friend class hash_map; ... 

为了交朋友另一个相同types的结构体:

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

注意在template<typename> friend struct Foo; 你不应该在typename / class之后写T ; 否则会导致模板parm shadowing错误。

在我的情况下这个解决scheme正常工作

 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;} }; 

我希望这会有帮助。