C++ 模板好友类:转发声明还是。。。?
假设我有一个模板类,我正试图将其声明为朋友类。我应该向前声明类还是给它自己的模板 例如:C++ 模板好友类:转发声明还是。。。?,c++,templates,friend-class,C++,Templates,Friend Class,假设我有一个模板类,我正试图将其声明为朋友类。我应该向前声明类还是给它自己的模板 例如: template <typename E> class SLinkedList; template <typename E> class SNode { private: E elem; SNode<E>* next; friend class SLinkedList<E>; }; 模板 类链接列表; 模板 类势垒{ 私人: E元素; 斯诺德*下
template <typename E>
class SLinkedList;
template <typename E>
class SNode {
private:
E elem;
SNode<E>* next;
friend class SLinkedList<E>;
};
模板
类链接列表;
模板
类势垒{
私人:
E元素;
斯诺德*下一个;
朋友级SLinkedList;
};
或
模板
类势垒{
私人:
E元素;
斯诺德*下一个;
模板
朋友级SLinkedList;
};
您的第一种方法可能就是您想要的。它将使SLinkedList
成为SNode
的朋友,并且对所有匹配类型都类似
第二种方法将使每个SLinkedList
成为每个SNode
的朋友。这可能不是您想要的,因为SLinkedList
不涉及SNode的私有部分
我可以推荐的另一种方法是将SNode
设置为嵌套类。这对于由节点组成的数据结构来说非常常见:
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};
模板
类链接列表{
结构势垒{
E元素;
斯诺德*下一个;
};
};
使用此方案,您还可以摆脱好友声明,并将SNode
中的所有内容公开,因为整个类将是SLinkedList的私有类
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};