The C++ FAQ offers guide how to write friend template declarations. I have a problem though when one of the arguments is a nested struct of the template class, e.g.:
template<typename T>
class MyClass;
template<typename T> QDataStream &operator<<(QDataStream &stream, const typename MyClass<T>::Node &node);
Neither of these versions work:
template<typename T>
class MyClass
{
private:
struct Node {};
friend QDataStream &operator<< <>(QDataStream &stream, const Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const MyClass::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const MyClass::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const typename MyClass<T>::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const typename MyClass::Node &node);
};
template<typename T>
QDataStream &operator<<(QDataStream &stream, const typename MyClass<T>::Node &node)
{
return stream;
}
The error given (by MSVC 2017) is:
error: C2672: '<<': no matching overloaded function found
What would be the proper syntax to write this?