struct A {
int a;
};
bool operator>(A& a, const int& inty) { return a.a > inty; }
// this next one doesn't compile
template <class A, class B> auto operator<(const A& a, const B& b) -> decltype(operator>(a,b)) { return a < b; }
// this next one does
template <class A, class B> auto operator<(const A& a, const B& b) -> decltype(a>b) { return a < b; }
int main(void) {
A a; a.a = 1; int b = 2;
//operator<(a,b);
a < b;
return 0;
c3RydWN0IEEgewoJaW50IGE7Cn07Cgpib29sIG9wZXJhdG9yPihBJiBhLCBjb25zdCBpbnQmIGludHkpIHsgcmV0dXJuIGEuYSA+IGludHk7IH0KCi8vIHRoaXMgbmV4dCBvbmUgZG9lc24ndCBjb21waWxlCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPiBhdXRvIG9wZXJhdG9yPChjb25zdCBBJiBhLCBjb25zdCBCJiBiKSAtPiBkZWNsdHlwZShvcGVyYXRvcj4oYSxiKSkgeyByZXR1cm4gYSA8IGI7IH0KCi8vIHRoaXMgbmV4dCBvbmUgZG9lcwp0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4gYXV0byBvcGVyYXRvcjwoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgLT4gZGVjbHR5cGUoYT5iKSB7IHJldHVybiBhIDwgYjsgfQoKaW50IG1haW4odm9pZCkgewoJQSBhOyBhLmEgPSAxOyBpbnQgYiA9IDI7CgkvL29wZXJhdG9yPChhLGIpOwoJYSA8IGI7CglyZXR1cm4gMDs=