模板朋友类:前瞻声明或......?

时间:2015-09-18 23:05:57

标签: c++ templates friend-class

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

示例:

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

1 个答案:

答案 0 :(得分: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