Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板好友类:转发声明还是。。。?_C++_Templates_Friend Class - Fatal编程技术网

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