There are different handling in gcc and clang for the friend function which is a template.
See the following example code [GodBolt](https://godbolt.org/z/jjo7M15c7)
If we use clang which version is bigger than 9.
The compiler will thorw out the error
`error: friend declaration of 'foo' does not match any declaration in namespace 'abc::cde'`
However, gcc works fine in this case.
My guess is that, clang will check the foo(T, MyClass&) is declared at Line26.
But gcc check the foo(T, MyClass&) at Line42, if we remove teh Line 32~37 and we can see the error:
`error: no matching function for call to 'foo(double, MyClass&)'`
```cpp=
#include <iostream>
struct MyClass;
namespace abc {
namespace cde {
template<typename T>
void foo(T,int);
}
};
/*
* this declaration is necessary.
* Clang will error out if removing this declaration.
* Gcc is fine
*/
namespace abc {
namespace cde {
template<typename T>
void foo(T,MyClass&);
}
};
struct MyClass {
template<typename T>
friend void abc::cde::foo(T,MyClass&);
private:
int mValue{3};
};
namespace abc::cde {
template<typename T>
void foo(T a,MyClass&) {
std::cout<<a<<'\n';
}
}
int main () {
MyClass t;
// error
abc::cde::foo(7.2, t);
abc::cde::foo(7, t);
return 0;
}
```