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

bad*_*lms 6 c++ templates friend-class

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

例:

template <typename E>
class SLinkedList;
template <typename E>
class SNode {
private:
  E elem;
  SNode<E>* next;
  friend class SLinkedList<E>;
};
Run Code Online (Sandbox Code Playgroud)

要么

template <typename E>
class SNode {
private:
  E elem;
  SNode<E>* next;
  template <typename T>
  friend class SLinkedList;
};
Run Code Online (Sandbox Code Playgroud)

Rya*_*ing 10

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

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


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

template <typename E>
class SLinkedList {
    struct SNode {
        E elem;
        SNode* next;
    };
};
Run Code Online (Sandbox Code Playgroud)

通过这个方案,您可以摆脱朋友声明并将所有内容SNode公之于众,因为整个课程都是私有的SLinkedList