Suppose I have a template class that I am trying to declare as a friend class. Should I forward declare the class or give it its own template?
Example:
template <typename E>
class SLinkedList;
template <typename E>
class SNode {
private:
E elem;
SNode<E>* next;
friend class SLinkedList<E>;
};
Or
template <typename E>
class SNode {
private:
E elem;
SNode<E>* next;
template <typename T>
friend class SLinkedList;
};
Your first approach is probably what you want. It will make SLinkedList<int>
a friend of SNode<int>
, and similar for all matching types.
Your second approach will make every SLinkedList
a friend of every SNode
. This is probably not what you want as SLinkedList<Widget>
has no business touching the private parts of an SNode<int>
A different approach I could recommend would be to make SNode
a nested class. This is pretty common for data structures consisting of nodes:
template <typename E>
class SLinkedList {
struct SNode {
E elem;
SNode* next;
};
};
With this scheme you may as well get rid of the friend declaration and have everything in SNode
be public, because the whole class would be private to SLinkedList
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With