类模板与模板类朋友,这里到底发生了什么?

新手上路,请多包涵

假设我正在为二叉树创建一个类 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 许可协议

阅读 287
2 个回答
template<class T> class BE{
  template<class T> friend class BT;
};

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


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

这意味着 bar 是 --- 的朋友,与 foo bar 的模板参数无关。 bar<char> , bar<int> , bar<float> , and any other bar would be friends of foo<char> .


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

这意味着 barfoo 的朋友,当 bar 的模板参数匹配 foo 时 —0371919bbd9420cf3b只有 bar<char> 会成为 foo<char> 的朋友。


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

原文由 Pubby 发布,翻译遵循 CC BY-SA 3.0 许可协议

使模板类成为模板类朋友的最佳方法如下:

 #include <iostream>
using namespace std;

template<typename T>
class B;

template<typename T>
class A
{
   friend class B<T>;
private:
   int height;
public:
   A()//constructor
   A(T val) //overloaded constructor

};

template<typename T>
class B
{
private:
   ...
public:
   B()//constructor
   B(T val) //overloaded constructor
};

原文由 Ans naeem 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题