模板友元类:前向声明或..
Template Friend Class: Forward Declaration or...?
假设我有一个模板类,我试图将其声明为友类。我应该转发声明类还是给它自己的模板?
的例子:
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
成为嵌套类。这对于由节点组成的数据结构非常常见:
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};
使用此方案,您可以摆脱友元声明并使SNode
中的所有内容都是公共的,因为整个类对于SLinkedList
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 将子类方法声明为基类的友元
- 在将函数声明为友元时,尖括号的含义是什么?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- C++ 17 个友元函数声明和内联命名空间
- 将派生类的构造函数声明为父类的友元
- 为什么 gcc 无法从其前向声明中检测到友元类命名空间?
- 类模板中文本运算符的友元声明
- 以嵌套类为参数的友元模板声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 如何将模板友元函数声明为可变参数类
- 嵌套友元类所需的前向声明
- 在派生类或基类中,我应该在哪里声明友元类
- 类定义交叉引用时如何声明友元方法
- 在此范围内未声明友元函数错误
- GCC声明友元函数是重载的,有歧义调用,clang编译
- 声明友元函数时出现变量作用域错误