以下のコードは、clang では正常にコンパイルされますが、 GCCではコンパイルされません(4.1.2、4.5.4、および 4.7.2 で試行):
template <typename T>
struct A
{
struct B { };
};
template <typename T>
bool operator==(typename A<T>::B const& b, T const& t);
enum { BAR };
template <typename T>
bool test()
{
return 0 == BAR;
}
GCC 4.7.2 からのエラー メッセージは次のとおりです。
a.cpp: In instantiation of ‘struct A<<anonymous enum> >’:
a.cpp:12:6: required by substitution of ‘template<class T> bool operator==(const typename A<T>::B&, const T&) [with T = <anonymous enum>]’
a.cpp:19:17: required from here
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’
GCCはコードを拒否するのが正しいですか、それともバグにぶつかっていますか?
PS オープンソース プロジェクトの 1 つをビルドしようとしているときに、このエラーが発生しました。それを再現する最小限の例を作成しようとしました。