4
次のことを考えてみましょう:テンプレート引数として可変長引数テンプレートの特殊化を使用して
template <class...>
struct MyT;
template <class T>
struct MyT<T> {};
template <template <class> class TT = MyT> struct A {}; // fine
using B = A<MyT>; // does not compile
int main() {
return 0;
}
MyT
がA
のデフォルト引数として使用する場合、コンパイラ(G ++ 5.4.0)を満足しています。しかしそれはA
をインスタンス化するために使用されるとき、物語は異なります。
temp.cpp:19:16: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class> class TT> struct A’
using B = A<MyT>;
^
temp.cpp:19:16: note: expected a template of type ‘template<class> class TT’, got ‘template<class ...> struct MyT’
私はエイリアスを導入することにより、それを修正することができます:
template <class T>
using MyTT = MyT<T>;
using B = A<MyTT>; // fine
質問:どのようなエラーの原因であるとされエイリアスを導入しないで解決策がありますか?
編集A
は、示されているようにテンプレートテンプレートパラメータを持つと宣言されており、変更のために与えられていないことに注意してください。
'template class TT = MyT> struct A {};'を使用してください。この場合、専門化は考慮されないため、定義が異なります。 – skypjack
+0
+0
A
3
+0
+0
0
+0
+0
+0
0
1
関連する問題
-
1. C++可変長引数テンプレートの特殊化(およびstatic_assert)
-
2. 可変引数テンプレートの特殊化の問題
-
3. 可変長テンプレート内のC++特殊化可変長テンプレート
-
4. テンプレート化された引き数を使ったテンプレート関数の特殊化
-
5. スタティック関数のテンプレートを使用したテンプレートの特殊化
-
6. C++のテンプレート関数のエイリアスを可変のテンプレート引数として
-
7. テンプレート関数をテンプレート関数の引数としてD
-
8. テンプレートの継承と可変引数
-
9. テンプレートテンプレートの引数として非タイプのテンプレート引数に依存する汎用関数のシグネチャを使用テンプレート
-
10. 可変テンプレート部分特殊化とconstexpr
-
11. 引数でクラスをテンプレート化 - 使用
-
12. 可変個引数テンプレートとCアレイ
-
13. アウトオブライン可変引数テンプレート関数
-
14. C++:テンプレート引数控除その他のテンプレート関数の引数としてテンプレート関数を渡す
-
15. テンプレートの引数としてのテンプレート関数
-
16. テンプレート関数の引数としてC++のテンプレートtypedef
-
17. テンプレートファンクタのテンプレート引数としてのテンプレート関数
-
18. テンプレート引数としての内部型
-
19. 配列引数を使用した関数の特殊化
-
20. C++テンプレートの特殊: "明示的なテンプレート引数の不正利用"
-
21. テンプレート関数のテンプレート引数
-
22. 変数をテンプレート引数として渡します。
-
23. C++ - 特殊化のベースとして既定のテンプレートを使用
-
24. C++可変テンプレート引数の反復
-
25. Clojureのテンプレート可変引数マクロ
-
26. C++ 11の仮想テンプレートメソッドまたは可変長引数テンプレート
-
27. テンプレート付き関数を使用した特殊化テンプレートクラス
-
28. C++ 11:可変引数テンプレート控除ロジック
-
29. テンプレート内のテンプレート。テンプレート関数内のテンプレートクラスの特殊化
-
30. テンプレート引数へのポインタを関数の引数として渡しますか?
最新の質問
-
1. 私のネットワーク(testrpc)にHelloWorld契約を展開できません
-
2. どのようにExpressのlocalhost上のprocess.env変数を設定できますか?
-
3. 2つの時間間隔の間にfriday日付を取得する方法
-
4. VBで動作していないIHttpActionResultを使用して配列をWeb APIにポストする
-
5. 角度と観測可能なデバウンス時間
-
1. C++可変長引数テンプレートの特殊化(およびstatic_assert)
-
2. 可変引数テンプレートの特殊化の問題
-
3. 可変長テンプレート内のC++特殊化可変長テンプレート
-
4. テンプレート化された引き数を使ったテンプレート関数の特殊化
-
5. スタティック関数のテンプレートを使用したテンプレートの特殊化
-
6. C++のテンプレート関数のエイリアスを可変のテンプレート引数として
-
7. テンプレート関数をテンプレート関数の引数としてD
-
8. テンプレートの継承と可変引数
-
9. テンプレートテンプレートの引数として非タイプのテンプレート引数に依存する汎用関数のシグネチャを使用テンプレート
-
10. 可変テンプレート部分特殊化とconstexpr
@skypjack 'A'の宣言は与えられたものです。私はこれを述べたはずです。 – AlwaysLearning
次に、正確に1つのパラメータを必要とするテンプレートクラスまたはエイリアス宣言を定義する必要があります。 – skypjack
答えて
これを行うことはできません。そのようなタイプはデフォルトパラメータとして使用できません。あなたがそれに頼らない限り、がとして受け入れられているという事実は、デフォルトのパラメータが有効なものであるという意味ではありません。
は、明示的にデフォルトのタイプを使用して、次のコードを考えてみましょう:
誤差は非常に明確である:
を持っていますこの場合、部分的な特殊化は考慮されないため、2つの宣言が異なります。
あなたはどちらかと
A
宣言する必要があります。をどこかあなたが行ったように使用して宣言により一例として、単一の引数に拘束された型を宣言します。
出典
2016-09-26 13:01:38 skypjack
どのようにして、コンパイラは 'MyT'のデフォルト引数としての適合性をチェックしていませんか?私は、コンパイラが通常、テンプレートをインスタンス化する前にそのようなチェックを実行すると思います... – AlwaysLearning
標準の観点から必須かUBかどうかはわかりません。私はそれが有効だと言っています、両方の主要なコンパイラがそれを行いますが、私よりも熟練した人が_standardese_で説明するのを待ってみましょう。 :-) – skypjack
「なぜあなたはこれをやろうとしますか?」という質問を忘れてしまいました。 テンプレートの特殊化を行わなかった場合、最初のバージョンが機能します。
は、テンプレートの特殊化を使用すると、コンパイラはベストマッチを決定しなければなりませんが、あなたが実際にテンプレート引数を提供していないので、それは曖昧です。
あなたは、単一のテンプレート引数を使用している
MyTT
を導入し、コンパイラは唯一の引数がある場合、あなたは専門を持っていることを確認するのに十分なスマートです:それはするのではなく、専門を選択この場合、バリデーショナルバージョンです。
しかし今、私たちは壮大な質問に戻る...なぜですか?
A
以内にあなたが常に特定のクラスでMyT
をインスタンス化している場合を除き、それがすべてでA
を使用することが無意味だ:出典
2016-09-26 13:09:21 AndyG
特殊化を行わないと動作しません**そしてバリデーションテンプレートを使用します。あなたが実際にプライマリテンプレートを一掃して、あなたの例では単一のパラメータを持つ特殊化を使用しています。このように、それは正しいので、それはすべてです。 – skypjack
コンパイラは 'MyTT'がテンプレートであることを知るのに十分にスマートですが、' A'のテンプレートパラメータがテンプレートであることを知るのに十分スマートではありませんか?違いはなんですか? – AlwaysLearning
@skypjack:それは私が意味するものです。単一テンプレートの構造体だけが存在する状況では、それは機能します。私は、OPが主なバリデーショナルテンプレートが存在するときにOPがそれを動作させることができる理由を掘り下げたいと思っていました。 – AndyG
私は2つの部分にあなたの質問を分割したいと思います。
A)は、あなたの構造のテンプレートがテンプレートクラスのTTのみ<クラス...>テンプレートでテンプレートを受け入れるので、それが動作します
簡単です考えてみましょう。特殊クラスはこれにカウントされません(その基底はまだテンプレート<クラスです...>)B)構造体Aをテンプレート<クラスに更新しても、>あなたはまだ持っていますもう一つの問題。 TTのテンプレート引数は何ですか?まず
出典
2016-09-26 13:40:56
あなたが本当にそれらの定義のシグネチャを更新できない場合は、プロキシクラスを行うことができ、
以下の例を参照してくださいしかししてください、デフォルトの引数はどちらか動作しません。
第2に、テンプレートテンプレートの引数は奇妙な獣です。テンプレートテンプレート引数が、テンプレートテンプレート引数で説明されているシグネチャでインスタンス化できるものをとる場合は意味があります。
これは動作しません。
代わりに、別の方法で動作します。
foo
a
またはb
を受け入れます。bar
b
となります。これを正しく理解すると、「これは何?」ということです。あなたが "何が地獄"に応答していない場合はバックアップし、あなたがそれを理解することができます参照してください。これは基本的にC++での引数の典型的な型定義から逆に動作します。それは引数よりも戻り値型のほうが動作します。
これは非常に非直感的で、なぜこれが正確にこのように動作するのかは、過去の履歴を追跡することを必要とするのではないかということです(逆反復と共分散の用語を学んでください)。 C++の
しかし、利点として、
template<class...>class
引数は「型パラメータのみを取る任意のテンプレート」となります。私はこれが非常に便利だと思う。弱点として、
template<class>class
は、ほぼ完全に無用です。Tl; dr:
template<template
パラメータをtemplate<template<class...>class
にして、タイプを取るテンプレートのみでメタプログラムを作成します。値をとるテンプレートがある場合は、std::size_t X
の要件をstd::integral_constant< std::size_t, X >
に置き換える型ラッパーを作成します。出典
2016-09-26 14:51:00 Yakk
関連する問題