#include <iostream>
using namespace std;
template<typename Derived>
class Comparisons {
public:
template <typename T>
friend bool operator!=(Comparisons<T> const& a, Comparisons<T> const& b);
};
template <typename Derived>
bool operator!=(const Comparisons<Derived>& lhs, const Comparisons<Derived>& rhs)
{
const Derived& d1 = static_cast<const Derived&>(lhs);
const Derived& d2 = static_cast<const Derived&>(rhs);
return !(d1 == d2);
}
struct Test : Comparisons<Test>
{
friend bool operator==(const Test& t1, const Test& t2);
};
bool operator==(const Test& t1, const Test& t2)
{
return true;
}
int main()
{
Test t1, t2;
bool b = t1 != t2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KY2xhc3MgQ29tcGFyaXNvbnMgewogcHVibGljOgogIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oQ29tcGFyaXNvbnM8VD4gY29uc3QmIGEsIENvbXBhcmlzb25zPFQ+IGNvbnN0JiBiKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgpib29sIG9wZXJhdG9yIT0oY29uc3QgQ29tcGFyaXNvbnM8RGVyaXZlZD4mIGxocywgY29uc3QgQ29tcGFyaXNvbnM8RGVyaXZlZD4mIHJocykKewogICAgY29uc3QgRGVyaXZlZCYgZDEgPSBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkJj4obGhzKTsKICAgIGNvbnN0IERlcml2ZWQmIGQyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCY+KHJocyk7CgogICAgcmV0dXJuICEoZDEgPT0gZDIpOwp9CgpzdHJ1Y3QgVGVzdCA6IENvbXBhcmlzb25zPFRlc3Q+CnsKICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdCYgdDEsIGNvbnN0IFRlc3QmIHQyKTsKfTsKCmJvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0JiB0MSwgY29uc3QgVGVzdCYgdDIpCnsKICAgIHJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpCnsKICAgIFRlc3QgdDEsIHQyOwoKICAgIGJvb2wgYiA9IHQxICE9IHQyOwoJCiAgICByZXR1cm4gMDsKfQ==