模板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
匹配时, bar
是foo
的朋友。 只有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;} };
我希望这会有帮助。