クラスの特殊化内で不完全な構造体を宣言し、後でそれを定義する際に問題があります。
struct Foo {
template <bool Y, typename D>
struct Bar {};
template <typename D>
struct Bar<true, D> {
struct Qux;
};
template <typename D>
struct Bar<true, D>::Qux { int x; };
};
このコードは gcc では機能しますが、clang 3.3 では失敗します。
r.cpp:42:26: error: non-friend class member 'Qux' cannot have a qualified name
struct Bar<true, D>::Qux { int x; };
~~~~~~~~~~~~~~^
コードが名前空間スコープ ( なしstruct Foo
) で記述されている場合、clang でも機能します。
一方、struct Foo
をテンプレートにすると、次のように、gcc-4.7 では動作し続けますが、gcc-4.9 (未リリース) ではコードが壊れます。
template <typename X>
struct Foo {
template <bool Y, typename D>
struct Bar {};
template <typename D>
struct Bar<true, D> {
struct Qux;
};
template <typename D>
struct Bar<true, D>::Qux { int x; };
};
Clang は次のエラーで失敗します。
r.cpp:43:26: error: template specialization or definition requires a template parameter list corresponding to the nested type 'Bar<true, type-parameter-1-0>'
struct Bar<true, D>::Qux { int x; };
^
r.cpp:43:26: error: non-friend class member 'Qux' cannot have a qualified name
struct Bar<true, D>::Qux { int x; };
~~~~~~~~~~~~~~^
2 errors generated.
Gcc-4.9 は同様のエラーで失敗します:
r.cpp:43:26: error: too few template-parameter-lists
struct Bar<true, D>::Qux { int x; };
^