3

クラスの特殊化内で不完全な構造体を宣言し、後でそれを定義する際に問題があります。

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; };
                          ^
4

2 に答える 2

2

その定義を名前空間スコープ (または内部) に配置する以外に選択肢がないように見えますBar。パラグラフ 9/1 (n3337) は、あなたのコードは違法であると述べています:

class-head-nameにnested-name-specifierが含まれる場合、 class - specifierは、nested-name- specifierが参照するクラスまたは名前空間、またはその名前空間のインライン名前空間セット (7.3.1) (つまり、単にusing-declarationによって継承または導入されたものではない)、class -specifierは、前の宣言を囲む名前空間に表示されます。 そのような場合、定義のclass-head-nameのnested-name-specifierはdecltype-specifierで始まってはなりません 。

于 2013-07-20T10:22:37.453 に答える
-3
struct Foo {
  template <bool Y, typename D>
  struct Bar {};
};

template <typename D>
struct Foo::Bar<true, D> {
  struct Qux;
};

template <typename D>
struct Foo::Bar<true, D>::Qux {
  int x;
};
于 2013-07-20T03:42:16.293 に答える