I have a following nested template class inside another template class:
template<typename T>
struct A
{
template<typename V>
struct B {};
};
What would be the signature of a non-member operator== for the nested type B? The following naïve attempt does not work:
template<typename T, typename V>
bool operator==(A<T>::B<V> left, A<T>::B<V> right);
Clang, GCC and MSVC gives various different errors and/or hints what is wrong such as missing template keyword but none of my attempts to resolve it worked out.
Note that this obviously works:
template<typename T>
struct A
{
template<typename V>
struct B {};
template<typename V>
friend bool operator==(B<V> left, B<V> right)
{
return true;
}
};
However the reason I need the out of line non-member declaration is to document it using qdoc. The qdoc is using clang to parse the sources and it requires me to provide the declaration of the operator== that I have actually implemented in place like just shown.
You can have an inline friend declaration and an outline definition
However gcc warns
And to fix that warning we would have to forward declare
operator==(B left, B right)before the definition ofB, which can only be insideA, which would force it to be a friend ofAalso.