#include <iostream>
using namespace std;
template <typename Derived>
struct Comparisons
{
};
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>
{
};
bool operator==(const Test& t1, const Test& t2)
{
return true;
}
int main()
{
Test t1, t2;
bool b = t1 != t2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CnN0cnVjdCBDb21wYXJpc29ucwp7Cn07CgoKdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CmJvb2wgb3BlcmF0b3IhPShjb25zdCBDb21wYXJpc29uczxEZXJpdmVkPiYgbGhzLCBjb25zdCBDb21wYXJpc29uczxEZXJpdmVkPiYgcmhzKQp7CiAgICBjb25zdCBEZXJpdmVkJiBkMSA9IHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQmPihsaHMpOwogICAgY29uc3QgRGVyaXZlZCYgZDIgPSBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkJj4ocmhzKTsKCiAgICByZXR1cm4gIShkMSA9PSBkMik7Cn0KCnN0cnVjdCBUZXN0IDogQ29tcGFyaXNvbnM8VGVzdD4Kewp9OwoKYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRlc3QmIHQxLCBjb25zdCBUZXN0JiB0MikKewogICAgcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkKewogICAgVGVzdCB0MSwgdDI7CgogICAgYm9vbCBiID0gdDEgIT0gdDI7CgkKICAgIHJldHVybiAwOwp9