テンプレートクラスの部分特殊化構文 -- c++ フィールド と templates フィールド 関連 問題

Template class partial specialization syntax












3
vote

問題

日本語

次の部分テンプレートクラスの専門化の基本的な例このWikiページ: <コード> template <typename Key, typename Value> class KeyValuePair { /* something generic */ }; template <typename Key> class KeyValuePair<Key, bool> { /* something specific to Value=bool */ }; KeyValuePair<int> kvpi;

コンパイラエラーを生成します。

<事前> <コード> prog.cpp:10:17: error: wrong number of template arguments (1, should be 2) KeyValuePair<int> kvpi;

なぜですか?私は何が悪いのですか? 部分テンプレートクラスの専門化を宣言してインスタンス化する方法は?

変数 kvpi は、 #email_input{ background-color: transparent; z-index: 100; } 0 のタイプの一部特殊なテンプレートクラスインスタンスになることを期待しています。

英語

The following basic example of partial template class specialization, taken from this wiki page :

template <typename Key, typename Value> class KeyValuePair { /* something generic */ };  template <typename Key> class KeyValuePair<Key, bool> { /* something specific to Value=bool */ };  KeyValuePair<int> kvpi; 

generates a compiler error :

prog.cpp:10:17: error: wrong number of template arguments (1, should be 2)  KeyValuePair<int> kvpi; 

Why ? what am I doing wrong ? How a partial template class specialization should be declared and instantiated ?

I am expecting variable kvpi to be a partially specialized template class instance of type KeyValuePair<int,bool>.

</div
     
         
         

回答リスト

6
 
vote
vote
ベストアンサー
 

デフォルトのテンプレート引数を使用して部分的な特殊化を混乱させるようです。それはさらにあなたが両方を必要とするように見えます(解除されていませんが、実際には重要ではありません)。完全に直感的ではないが、それは以下のように達成することができる:

<事前> <コード> #include <iostream> template <typename Key, typename Value = bool> class KeyValuePair { public: KeyValuePair() { std::cout << __PRETTY_FUNCTION__ << ':' << "original "; } }; template <typename Key> class KeyValuePair<Key, bool> { public: KeyValuePair() { std::cout << __PRETTY_FUNCTION__ << ':' << "specialized "; } }; int main() { KeyValuePair<int,int> kvp1; KeyValuePair<int> kvp2; }

出力

<事前> <コード> KeyValuePair<int, int>::KeyValuePair() [Key = int, Value = int]:original KeyValuePair<int, bool>::KeyValuePair() [Key = int, Value = bool]:specialized

ManCusの紛らわしい部分は、デフォルトの引数指定ですが、後の専門化のためにそのデフォルト-argで実際に完全なことを確認することは決してないであろうテンプレートです。そのような場合、私はテンプレートをデフォルトの引数リストで転送することをお勧めします。少なくとも私にとってそれは読むのがわずかに簡単になります。あなたがそれが明快さを提供すると感じるならば、あなたは同じことをすることを選択することができます(そうではありません)。

のようなもの <事前> <コード> template <typename Key, typename Value = bool> class KeyValuePair; template <typename Key, typename Value> class KeyValuePair { public: KeyValuePair() { std::cout << __PRETTY_FUNCTION__ << ':' << "original "; } }; template <typename Key> class KeyValuePair<Key, bool> { public: KeyValuePair() { std::cout << __PRETTY_FUNCTION__ << ':' << "specialized "; } };
 

You appear to be confusing partial specialization with default template arguments. It further appears you need both (for reasons unstated, but not really important). Though not entirely intuitive, it can be accomplished as follows:

#include <iostream>  template <typename Key, typename Value = bool> class KeyValuePair { public:     KeyValuePair()     {         std::cout << __PRETTY_FUNCTION__ << ':' << "original ";     } };  template <typename Key> class KeyValuePair<Key, bool> { public:     KeyValuePair()     {         std::cout << __PRETTY_FUNCTION__ << ':' << "specialized ";     } };   int main() {     KeyValuePair<int,int> kvp1;     KeyValuePair<int> kvp2; } 

Output

KeyValuePair<int, int>::KeyValuePair() [Key = int, Value = int]:original KeyValuePair<int, bool>::KeyValuePair() [Key = int, Value = bool]:specialized 

The confusing part to some is the default argument specification, but a template that follows which will never actually see fruition with that default-arg because of the later specialization. In such cases I prefer to forward-declare the template with its default argument list. At least for me it makes it slightly easier to read. You may (or not) choose to do the same if you feel it offers clarity. Something like:

template <typename Key, typename Value = bool> class KeyValuePair;  template <typename Key, typename Value> class KeyValuePair { public:     KeyValuePair()     {         std::cout << __PRETTY_FUNCTION__ << ':' << "original ";     } };  template <typename Key> class KeyValuePair<Key, bool> { public:     KeyValuePair()     {         std::cout << __PRETTY_FUNCTION__ << ':' << "specialized ";     } }; 
</div
 
 
 
 
4
 
vote

パーシャルテンプレートの専門化を使用すると、テンプレートパラメータを忘れることができません。あなたは書く必要があります:

<事前> <コード> KeyValuePair<int, bool> kvpib;

と正しい専門化が使用されます。

しかしあなたはあなたが欲しいものを達成するために継承を使うことができます:

<事前> <コード> template <typename Key> class KeyBoolPair : public KeyValuePair<Key, bool> {}; KeyBoolPair<int> kbpi;

またはC ++ 11以上を使用している場合:

<事前> <コード> template <typename Key> using KeyBoolPairBis = KeyValuePair<Key, bool>; KeyBoolPairBis<int> kbpbi;

例: http://coliru.stacked-crowed.com/a/5095fc5c358d291a

 

Partial template specialization doesn't allow you to forget a template parameter. You have to write:

KeyValuePair<int, bool> kvpib; 

and correct specialization will be used.

But you can use inheritance to achieve what you want:

template <typename Key> class KeyBoolPair : public KeyValuePair<Key, bool> {};  KeyBoolPair<int> kbpi; 

or if you use C++11 or greater:

template <typename Key> using KeyBoolPairBis = KeyValuePair<Key, bool>;  KeyBoolPairBis<int> kbpbi; 

example: http://coliru.stacked-crooked.com/a/5095fc5c358d291a

</div
 
 
     
     
3
 
vote

部分的な特殊化を正しく定義しますが、テンプレートは2の引数を期待しており、1つだけを指定します。

デフォルトの引数を使用することができます。

<事前> <コード> template <typename Key, typename Value = bool> class KeyValuePair {};

を許可する <事前> <コード> KeyValuePair<int> kvpi;

必要に応じてあなたの部分的な専門化を保つことができます

<事前> <コード> <h1>Test</h1> <div> <input id="autofill" type="text" value="1234567890"> <input id="email_input" type="text"> </div>0
 

You define your partial specialization correctly, but the template expect 2 argument and you provide only one.

You may use default argument:

template <typename Key, typename Value = bool> class KeyValuePair {}; 

to allow

KeyValuePair<int> kvpi; 

And you may keep your partial specialization if needed

template <typename Key> class KeyValuePair<Key, bool> { /* something specific to Value=bool */ }; 
</div
 
 
   
   

関連する質問

3  テンプレートクラスメンバ関数への関数ポインタ  ( Function pointer to template class member functions ) 
私はテンプレート化されたクラス(部分的に)として定義されています <事前> <コード> template <class T> MyClass { public: void DoSomething(){} }; 他のクラスからDosomethingを呼...

3  もう一つの不思議なことに繰り返しのテンプレートパターン  ( Another curiously recurring template pattern ) 
<事前> <コード> template <class Data, class Allocator = std::allocator<Node> > class Node : public Data { // ... }; 質問は簡単です、上記のコードを...

26  どのサイトが無料で品質のWebサイトのデザインテンプレートを提供していますか? [閉まっている]  ( What sites offer free quality web site design templates ) 
閉じたこの質問はオフトピックです。現在答えを受け付けていません。 この質問を改善したいですか?質問を更新するスタックオーバーフロ...

2  ユーザーから隠したいテンプレートパラメータの束があります。これどうやってするの?  ( I have a bunch of template parameters that i want to hide from my users how can ) 
私はそれが使用するいくつかの内部タイプに関して定義されたスーパークラスを持っています。サブクラスはそのように実行されます。 <事前> <コード> template <class InternalType1, class InternalType2> class...

0  C ++非タイプテンプレートパラメータコンパイル時刻確認  ( C non type template parameter compile time check ) 
私は2つの非タイプのテンプレートパラメータを持つC ++クラスを持っています: size_t型の寸法とオブジェクトのベクトルへのconst参照。 <事前> <コード> template <size_t DIMENSION, const std::vector...

7  スマートタイミーでの再帰を処理する最善の方法は何ですか?  ( What is the best way to handle recursion in smarty ) 
私はスマートよ賢さでの再帰を処理するためのいくつかの方法を見つけました、主に彼ら自身のテンプレートを含めることに基づいている、それはリソースのばかげた浪費のようです。私は一つのソリューションを見つけました、賢いスマートよ賢者でちょうどいいように思われた - し...

4  コンパイル時タイプベースのディスパッチ  ( Compile time type based dispatch ) 
「現代C ++デザイン」からのテクニックは、さまざまなコンパイル時の最適化を備えた永続ライブラリを実装しています。その変数が指定されたクラスから派生した場合、テンプレートメンバー変数に関数をディスパッチする機能を希望します。 <事前> <コード> templa...

10  テンプレートの友情  ( Template friendship ) 
テンプレートパラメータが異なるテンプレートクラスの保護変数にアクセスしようとしています。テンプレートパラメータを使用した友人宣言は、次のエラーを与えています。 複数のテンプレートパラメータリストは許可されていません マイコードは <事前> <コード> te...

3  テンプレートから構築されたWPFオブジェクトを自動的にフリーズする  ( Automatically freeze wpf objects built from templates ) 
は、彼らがDataTemplate、ControlTemplate、またはスタイルを介して生成された場合、凍結可能なWPFオブジェクトは自動的に凍結されるのですか? ...

4  JavaScriptテンプレートシステム - Pure、EJS、jQuery Plugin?  ( Javascript template system pure ejs jquery plugin ) 
誰かがJavaScriptテンプレートシステムを使用していますか?私はJavaScriptMVCに埋め込まれているものを使用しましたが、私は今サーバーサイドの開発を行っているので、私はより合理化された/シンナーバージョンを望んでいました。 私は2. 1がjav...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有