模板友元类:前向声明或..

Template Friend Class: Forward Declaration or...?

本文关键字:声明 友元      更新时间:2023-10-16

假设我有一个模板类,我试图将其声明为友类。我应该转发声明类还是给它自己的模板?

的例子:

template <typename E>
class SLinkedList;
template <typename E>
class SNode {
private:
  E elem;
  SNode<E>* next;
  friend class SLinkedList<E>;
};

template <typename E>
class SNode {
private:
  E elem;
  SNode<E>* next;
  template <typename T>
  friend class SLinkedList;
};

您的第一种方法可能是您想要的。它将使SLinkedList<int>成为SNode<int>的朋友,并且所有匹配类型都相似。

您的第二种方法将使每个SLinkedList成为每个SNode的朋友。这可能不是你想要的,因为SLinkedList<Widget>没有业务触及SNode<int>的私有部分


我可以推荐的另一种方法是使SNode成为嵌套类。这对于由节点组成的数据结构非常常见:

template <typename E>
class SLinkedList {
    struct SNode {
        E elem;
        SNode* next;
    };
};

使用此方案,您可以摆脱友元声明并使SNode中的所有内容都是公共的,因为整个类对于SLinkedList

将是私有的。