0

次のコードは正常にコンパイルされますが、その理由がわかりません。

#include <stdio.h>
#include <vector>
#include <iostream>

// Template definition
template <typename T1, typename T2> class stack
{
};

// Template specialization
template <> class stack <float, float>
{
};

int main ()
{
  stack <char, char> objStack;
  return 0;
}    

部分的な特殊化とは、特殊化で指定した特定のデータ型にクラスを使用できることを意味していませんか?

ここにはcharに特化したクラスはありません。また、あらゆる種類のデータ型でコンパイルする場合、特殊化の目的は何ですか?

4

2 に答える 2

2

テンプレートの特殊化とは、汎用テンプレートを使用して、特殊な型のセットに使用される型または関数を追加することを意味します。部分的な特殊化とは、複数のパラメーターを持つテンプレート型または関数があり、特殊化ですべてのパラメーターを指定していない場合です。

あなたの例では、この関数は一般的なテンプレートです。

// Template definition
template <typename T1, typename T2> class stack
{
};

2 つの float を指定した場合を除き、指定した任意の型に対してインスタンス化されます。パラメータとして 2 つの float を指定する場合、このテンプレート

// Template specialization
template <> class stack <float, float>
{
};

インスタンス化されます。

于 2011-04-02T06:02:46.103 に答える
2

テンプレートの特殊化は、特定のテンプレート パラメーターに対して特に異なることをしたい場合に使用します。コンパイラは、元のテンプレートから指定されていないものをすべてインスタンス化します。

これは、特定のデータ型に対して異なる動作が必要な場合に役立ちますが、ポインター型またはconst型の動作を変更するなど、より複雑なパターン マッチングにも使用できます。

template <typename T>
struct is_pointer { static bool value = false; };

template <typename T>
struct is_pointer<T*> { static bool value = true; };

template <typename T>
struct is_const { static bool value = false; };

template <typename T>
struct is_const<const T>  { static bool value = true; };

// later, try this:
assert(is_pointer<int*>::value == true);
assert(is_pointer<int>::value == false);

つまり、簡単に言うと、特定のパラメーターに特別な関係があり、基本テンプレートに一般化できない場合を除き、わざわざテンプレートを指定しないでください。テンプレートの特殊化は、善と悪の両方に使用できるパターン マッチングのかなりハードコアな形式です。

于 2011-04-02T06:04:09.647 に答える