6

假设我有一个要声明为友元类的模板类。我应该转发声明类还是给它自己的模板?

例子:

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

1 回答 1

10

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

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


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

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

有了这个方案,你也可以摆脱朋友声明,让一切都SNode公开,因为整个班级都是私有的SLinkedList

于 2015-09-18T23:13:00.480 回答