请看下面的代码:
template<typename T>
struct A
{
T i;
// friend bool operator<(A const& l, A const& r) { return l.i < r.i; }
};
template<typename T> bool operator<(A<T> const& l, A<T> const& r) { return l.i < r.i; }
struct B
{
float f;
template<typename T> operator A<T>() const { return A<T>{static_cast<T>(f)}; }
};
int main()
{
bool a = A<int>{3} < A<int>{4};
bool b = A<int>{3} < B{5.4f};
}
通过 friend operator 实现的比较可以支持 A 与 B 的比较,而在外面直接实现 operator 则会导致 A 与 B 的比较编译出错,参考:
https://godbolt.org/z/xsBlnA
这是为啥呢?如果不借助 friend 如何才能使得 A 与 B 可以正常比较?