假设我正在为二叉树创建一个类 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:
...
};
这似乎有效;但是我对下面发生的事情有疑问。
我最初试图将朋友声明为
template<class T> friend class BT;
但是,这里似乎有必要使用 U
(或 T
以外的其他东西),这是为什么呢?这是否意味着任何特定的 BT
是任何特定的 BE
类的朋友?
关于模板和朋友的 IBM 页面提供了函数但没有类的不同类型朋友关系的示例(并且猜测语法尚未收敛到解决方案上)。我更愿意了解如何为我希望定义的朋友关系类型获得正确的规范。
原文由 Michael Conlen 发布,翻译遵循 CC BY-SA 4.0 许可协议
不允许,因为模板参数不能相互影响。嵌套模板必须具有不同的模板参数名称。
这意味着
bar
是 --- 的朋友,与foo
bar
的模板参数无关。bar<char>
,bar<int>
,bar<float>
, and any otherbar
would be friends offoo<char>
.这意味着
bar
是foo
的朋友,当bar
的模板参数匹配foo
时 —0371919bbd9420cf3b只有bar<char>
会成为foo<char>
的朋友。在您的情况下,
friend class bar<T>;
应该就足够了。