模板友元类:前向声明还是……?

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;
};
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来说都是私有的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接