派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

WF

この質問の続きですこのようなメンバークラスの部分的な特殊化に特に興味があります。

struct FooParent {
    template <class>
    struct Bar{ };
};

struct Foo: FooParent {
    template <class T>
    struct Bar<T*> {};
};

私はこれが名前空間スコープ内で実行できることを知っています:

template <class T>
struct Foo::Bar<T*>{ };

しかし、私はまた、具体的に興味イン・クラスの派生クラスのレベルで部分特殊。

前者に遭遇すると、clangとgccの両方が文句を言います。

clangは、明らかに発生しない明示的なテンプレートの特殊化があると述べています。

エラー:クラススコープでの「Bar」の明示的な特殊化

gccはここでは少し冗長ではなく、メンバーテンプレートの特殊化は名前空間スコープで実行する必要があると述べていますが、これは明らかに派生クラスではない場合です。

エラー: 'template struct FooParent :: Bar'の特殊化は名前空間スコープに表示される必要があります

gccは彼のエラーメッセージのここにありますか?

skypjack

OPの要請に応じて、質問へのコメントで私が言ったことを要約しようとしています。


質問に答えるには[temp.class.spec] / 5で十分だと思います。
特に:

クラステンプレートの部分的な特殊化は、対応するプライマリテンプレートを定義できる任意の名前空間スコープで宣言または再宣言できます[...]。

この場合、実際にそれを支配するのは、プライマリテンプレートを定義できる場所です。
この例では、派生クラスの部分的な特殊化を宣言しようとしています(そして、コンテキストで定義しますが、まずは宣言です)。

簡単に言うと、派生クラスでプライマリテンプレートを定義することはできないため、そのクラスで部分的な特殊化を宣言することもできません。

可能であれば、次のことも可能でした。

struct FooParent {
    template <class>
    struct Bar;
};

struct Foo: FooParent {
    template <class T>
    struct FooParent::Bar<T*> {};
};

または、必要に応じてこれ:

struct Foo: FooParent {
    template <class T>
    struct Bar<T*> {};
};

残念ながら(?)それらは許可されておらず、これはクラステンプレートを特殊化する試みも無効であることを伝えるのに十分です。

とにかく、もう少し考えてみましょう。
プライマリテンプレートは、のメンバー仕様の一部ですFoo(詳細については、ここを参照してください)。
したがって、質問-そのようなテンプレートをどこで定義できますか?、迅速になり-私はクラスの他のメンバーを定義することができますどこ?
繰り返しますが、答えは-派生クラスのスコープ内ではありません


言語弁護士があなたにもっと直接的で率直な説明をしてくれると確信しています。
私はまた、同じ言語の弁護士が、標準の間違ったセクションに言及したことで私を呪うだろうと確信しています。
とにかく、上記のいくつかの例があなたに出発点となることを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

分類Dev

クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

分類Dev

クラステンプレートの定義されていないメンバークラスの明示的な特殊化で隠された友達を定義することは合法ですか?

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

分類Dev

外部クラスの可変個引数テンプレートからの引数を使用して、可変個引数テンプレートの内部クラスを部分的に特殊化することは合法ですか?

分類Dev

派生テンプレートクラスの基本クラスからメソッドを特殊化します

分類Dev

すべてを再実装することなく、c ++クラステンプレートの特殊化

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレート クラス内のメソッドを特殊化する適切な方法

分類Dev

テンプレート引数なしで派生クラスでテンプレートクラス名を使用することは合法ですか?

分類Dev

派生クラスから基本クラスコンストラクターの特殊化を実装する別の方法は何ですか?

分類Dev

複数のパラメーターに対するC ++部分クラステンプレートの特殊化

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

1つのクラスのメンバーtypedefをテンプレート特殊化定義のテンプレートパラメーターとして使用することはできません

分類Dev

別のクラスをクラステンプレートの特殊化として使用する方法

分類Dev

別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

分類Dev

テンプレートクラスの部分特殊化構文

分類Dev

パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

分類Dev

フレンドクラスの部分的なテンプレートの特殊化?

分類Dev

特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

分類Dev

doubleでテンプレートクラスを特殊化する方法は?

分類Dev

クラスでのメンバークラステンプレートの特殊化の使用

分類Dev

派生クラスによるc ++テンプレートの特殊化

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

Related 関連記事

  1. 1

    クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

  2. 2

    クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

  3. 3

    クラステンプレートの定義されていないメンバークラスの明示的な特殊化で隠された友達を定義することは合法ですか?

  4. 4

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  5. 5

    C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

  6. 6

    外部クラスの可変個引数テンプレートからの引数を使用して、可変個引数テンプレートの内部クラスを部分的に特殊化することは合法ですか?

  7. 7

    派生テンプレートクラスの基本クラスからメソッドを特殊化します

  8. 8

    すべてを再実装することなく、c ++クラステンプレートの特殊化

  9. 9

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  10. 10

    クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

  11. 11

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  12. 12

    テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

  13. 13

    テンプレート クラス内のメソッドを特殊化する適切な方法

  14. 14

    テンプレート引数なしで派生クラスでテンプレートクラス名を使用することは合法ですか?

  15. 15

    派生クラスから基本クラスコンストラクターの特殊化を実装する別の方法は何ですか?

  16. 16

    複数のパラメーターに対するC ++部分クラステンプレートの特殊化

  17. 17

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  18. 18

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  19. 19

    1つのクラスのメンバーtypedefをテンプレート特殊化定義のテンプレートパラメーターとして使用することはできません

  20. 20

    別のクラスをクラステンプレートの特殊化として使用する方法

  21. 21

    別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

  22. 22

    テンプレートクラスの部分特殊化構文

  23. 23

    パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

  24. 24

    フレンドクラスの部分的なテンプレートの特殊化?

  25. 25

    特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

  26. 26

    doubleでテンプレートクラスを特殊化する方法は?

  27. 27

    クラスでのメンバークラステンプレートの特殊化の使用

  28. 28

    派生クラスによるc ++テンプレートの特殊化

  29. 29

    C ++テンプレートの特殊化に基本クラスを追加する

ホットタグ

アーカイブ