みなさんレスありがとうございます。

>> 532
gcc 3.3.2では通ってました。ターゲットはarm-elfでしたけど、関係ないですよね…
今cygwinのgcc 3.4.4で試してみても通りました。

# ADSではtemplateつかえないみたいです…orz

>> 533, 525
普段はADSというarmの純正開発環境を使っていてarmのデバッガだと
HOGE a = err1;
a |= err2;
とかで
err1 | err2
と識別子情報を拾って表示してくれて見やすいので多用してました。
gdbだと拾ってくれないみたいですね。

Cでenumはintで実装されると思ってたんですけど
実装依存なんですかね?
規格とか持ってないんで判んないんですけど。

>> 536
// return static_cast<HOGE>(l | r); // コンパイル通らなかった
// return static_cast<HOGE>(static_cast<int>l | static_cast<int>r); // コンパイル通らなかった
return static_cast<HOGE>((int)l | (int)r);

なぜか↑のようにしないとコンパイル通りませんでしたけど、これでいけそうです。
enum自身にも演算子再定義できるとは知りませんでした。