sizeof に () がついているのでVC++は()内を優先的に型として判断しようとする。
CompileTimeChecker<(expr)!=0>( ( ERROR_##msg() ) )
は、
CompileTimeChecker<(expr)!=0> を戻り値とし、
引数を持たない ERROR_##msg という関数のプロトタイプなので、
そのサイズを取得しようとするが、
ERROR#msg はすでに class として定義されているので、エラーになる。

VC++の挙動が正しいかと。
sizeof の () をはずせばエラーは出なくなる。