#include <iostream>
using namespace std;
template <class T>
struct test1 {
enum test2 {
test3, test4
};
};
template <class T>
typename test1<T>::test2 operator | (typename test1<T>::test2 f1, typename test1<T>::test2 f2) {
return static_cast<typename test1<T>::test2>(
static_cast<unsigned>(f1) | static_cast<unsigned>(f2)
);
}
int main() {
test1<int>::test2 flags = operator | <int> (test1<int>::test3, test1<int>::test4);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCB0ZXN0MSB7CgllbnVtIHRlc3QyIHsKCQl0ZXN0MywgdGVzdDQKCX07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyIG9wZXJhdG9yIHwgKHR5cGVuYW1lIHRlc3QxPFQ+Ojp0ZXN0MiBmMSwgdHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyIGYyKSB7CglyZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyPigKCQlzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZjEpIHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGYyKQoJKTsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0MTxpbnQ+Ojp0ZXN0MiBmbGFncyA9IG9wZXJhdG9yIHwgPGludD4gKHRlc3QxPGludD46OnRlc3QzLCB0ZXN0MTxpbnQ+Ojp0ZXN0NCk7Cn0=