16

以下のコードは、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: ‘&lt;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: ‘&lt;anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error:   trying to instantiate ‘template<class T> struct A<T>::B’

GCCはコードを拒否するのが正しいですか、それともバグにぶつかっていますか?

PS オープンソース プロジェクトの 1 つをビルドしようとしているときに、このエラーが発生しました。それを再現する最小限の例を作成しようとしました。

4

1 に答える 1

1

元の標準によると、有効な C++ ではありません。

標準の14.3.1は次のように述べています。

2 ローカル型、リンケージのない型、名前のない型、またはこれらの型のいずれかから複合された型は、テンプレート型パラメーターのテンプレート引数として使用してはなりません。[例: ...

ただし、これは最新の C++11 標準によって制限が削除されたと思います。これは、一部のコンパイラがそれを受け入れ、他のコンパイラがそれを拒否する理由を説明するかもしれません.

于 2012-12-04T12:40:45.077 に答える