#include <iostream>
class X { };
template <class T>
class Mistake {
public:
T x;
Mistake(const T& k) : x(k) { }
Mistake(const X&) : x(1) { }
void print() { std::cout << x << std::endl; }
};
template <class T>
Mistake<T> operator+(const Mistake<T>& a, const Mistake<T>& b) {
return Mistake<T>(a.x + b.x);
}
template <class T, class U>
Mistake<T> operator+(const Mistake<T>& a, U const& b) {
return a + static_cast<Mistake<T>>(b);
}
template <class T, class U>
Mistake<T> operator+(const U& a, Mistake<T> const& b) {
return static_cast<Mistake<T>>(a) + b;
}
int main()
{
X a, b;
Mistake<int> foo = static_cast<Mistake<int>>(a) + static_cast<Mistake<int>>(b);
foo = Mistake<int>(a) + b;
foo = a + Mistake<int>(b);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgWCB7IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgTWlzdGFrZSB7CiAgICBwdWJsaWM6CiAgICAgICAgVCB4OwoKICAgICAgICBNaXN0YWtlKGNvbnN0IFQmIGspIDogeChrKSB7IH0KICAgICAgICBNaXN0YWtlKGNvbnN0IFgmKSA6IHgoMSkgeyB9CgogICAgICAgIHZvaWQgcHJpbnQoKSB7IHN0ZDo6Y291dCA8PCB4IDw8IHN0ZDo6ZW5kbDsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+Ck1pc3Rha2U8VD4gb3BlcmF0b3IrKGNvbnN0IE1pc3Rha2U8VD4mIGEsIGNvbnN0IE1pc3Rha2U8VD4mIGIpIHsKICAgIHJldHVybiBNaXN0YWtlPFQ+KGEueCArIGIueCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgpNaXN0YWtlPFQ+IG9wZXJhdG9yKyhjb25zdCBNaXN0YWtlPFQ+JiBhLCBVIGNvbnN0JiBiKSB7CiAgICByZXR1cm4gYSArIHN0YXRpY19jYXN0PE1pc3Rha2U8VD4+KGIpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KTWlzdGFrZTxUPiBvcGVyYXRvcisoY29uc3QgVSYgYSwgTWlzdGFrZTxUPiBjb25zdCYgYikgewogICAgcmV0dXJuIHN0YXRpY19jYXN0PE1pc3Rha2U8VD4+KGEpICsgYjsKfQoKaW50IG1haW4oKQp7CiAgICBYIGEsIGI7CiAgICBNaXN0YWtlPGludD4gZm9vID0gc3RhdGljX2Nhc3Q8TWlzdGFrZTxpbnQ+PihhKSArIHN0YXRpY19jYXN0PE1pc3Rha2U8aW50Pj4oYik7CiAgICBmb28gPSBNaXN0YWtlPGludD4oYSkgKyBiOwogICAgZm9vID0gYSArIE1pc3Rha2U8aW50PihiKTsKfQo=