#include <iostream>
using namespace std;
template<typename T>
class Base
{
public:
Base(int X) { x = X; }
friend T operator+(const Base& lhs, const Base& rhs)
{
return T(lhs.x + rhs.x);
}
int x;
};
class Derived : public Base<Derived>
{
public:
Derived(int arg) : Base(arg) { }
using Base::Base;
};
int main()
{
Derived der1(1);
Derived der2(2);
Derived der3 = der1 + der2;
cout << der3.x << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBCYXNlCnsKcHVibGljOgoJQmFzZShpbnQgWCkgeyB4ID0gWDsgfQoKCWZyaWVuZCBUIG9wZXJhdG9yKyhjb25zdCBCYXNlJiBsaHMsIGNvbnN0IEJhc2UmIHJocykKCXsKCQlyZXR1cm4gVChsaHMueCArIHJocy54KTsKCX0KCglpbnQgeDsKfTsKCmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxEZXJpdmVkPgp7CnB1YmxpYzoKCURlcml2ZWQoaW50IGFyZykgOiBCYXNlKGFyZykgeyB9Cgl1c2luZyBCYXNlOjpCYXNlOwp9OwoKaW50IG1haW4oKQp7CglEZXJpdmVkIGRlcjEoMSk7CglEZXJpdmVkIGRlcjIoMik7CgoJRGVyaXZlZCBkZXIzID0gZGVyMSArIGRlcjI7CgkKCWNvdXQgPDwgZGVyMy54IDw8IGVuZGw7CgoJcmV0dXJuIDA7Cn0=