struct MakeFlags
{
    template <class T>
    friend T operator |(T a, T b) { return (T) ((int) a | (int) b); }
    template <class T>
    friend T operator &(T a, T b) { return (T) ((int) a & (int) b); }
};

struct Flags : MakeFlags {
    enum T { Flag1 = 1, Flag2 = 2, Flag3 = 4 };
};

int main()
{
    Flags::T test = Flags::Flag1 | Flags::Flag2;
    return 0;
}