模板朋友 Class:转发声明或...?
Template Friend Class: Forward Declaration or...?
假设我有一个模板 class,我正试图将其声明为朋友 class。我应该转发声明 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;
};
您的第一种方法可能就是您想要的。它将使 SLinkedList<int>
成为 SNode<int>
的朋友,并且所有匹配类型都相似。
您的第二种方法将使每个 SLinkedList
成为每个 SNode
的朋友。这可能不是你想要的,因为 SLinkedList<Widget>
不应该接触 SNode<int>
的隐私部分
我可以推荐的另一种方法是使 SNode
成为嵌套的 class。这对于由节点组成的数据结构来说很常见:
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};
使用此方案,您还可以摆脱朋友声明,让 SNode
中的所有内容成为 public,因为整个 class 对 SLinkedList
是私有的]
假设我有一个模板 class,我正试图将其声明为朋友 class。我应该转发声明 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;
};
您的第一种方法可能就是您想要的。它将使 SLinkedList<int>
成为 SNode<int>
的朋友,并且所有匹配类型都相似。
您的第二种方法将使每个 SLinkedList
成为每个 SNode
的朋友。这可能不是你想要的,因为 SLinkedList<Widget>
不应该接触 SNode<int>
我可以推荐的另一种方法是使 SNode
成为嵌套的 class。这对于由节点组成的数据结构来说很常见:
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};
使用此方案,您还可以摆脱朋友声明,让 SNode
中的所有内容成为 public,因为整个 class 对 SLinkedList
是私有的]