I had some trouble doing this but finally figured it out. Here is a general solution:
Code:
#include <iostream>
using namespace std;
// Pre-declare class template...
template <class T> class MyTemplate;
// So we can pre-declare inserter...
template <class T> ostream &operator<<(ostream &stream, const MyTemplate<T> &t);
// So when we define the class template...
template <class T> class MyTemplate {
// We can declare inserter a friend.
friend ostream &operator<< <T> (ostream &stream, const MyTemplate<T> &t);
...
}
// Now inserter can access MyTemplate's private members
template <class T> ostream &operator<<(ostream &stream, const MyTemplate<T> &t) {
...
}
Hope this helps someone.