3

私はこのようなクラスを持っています:

template <class T>
class Foo;

専門にしたい

template <>
class Foo < size_t N >;

しかし、それは私のためにコンパイルされません:

私のメインは次のようなものです:

Foo<int> p;  // OK
Foo<15> p2;  // fails to compile

私は何が欠けていますか?

4

3 に答える 3

5

できません-テンプレートは常に1つの型パラメーターを取ります。スペシャライゼーションはそれよりも特別なものにすることができますが、違いはありません(そのため名前が付けられています)。

補助テンプレートを使用して、値情報を格納できる場合があります。

template <typename T, T Val> struct ValueWrapper { };

template <typename T> struct Foo;

templaet <typename T, T Val> struct Foo<ValueWrapper<T, Val>>
{
    typedef T type;
    static type const value = Val;

    // ...
};

使用法:

Foo<char> x;
Foo<ValueWrapper<int, 15>> y;
于 2012-08-15T06:15:34.730 に答える
3

class Tテンプレートパラメータには、タイプ(egまたはtypename T)を表すもの、非タイプ(egint Nまたはsize_t N)を表すもの、およびテンプレート(eg )を表すものの3種類がありますtemplate <class T2> class T

テンプレートに定義されたパラメーターは第1の種類(タイプパラメーター)ですが、特殊化では第2の種類(非タイプパラメーター)を想定しています。それはうまくいきません。特殊化のパラメーターは、プライマリテンプレート定義の対応するパラメーターと同じ種類である必要があります。

于 2012-08-15T04:27:50.710 に答える
2

中間クラスを使用してクラスを特殊化できます。

template <class T>
class Foo
{
public:
  static const bool is_number = false;
};
template <size_t number>
struct ic
{};
template <size_t N>
class Foo < class ic<N> >
{
public:
   static const bool is_number = true;
   size_t getN() const
   {
      return N;
   } 
};

int main()
{
   Foo<int> p;  
   Foo<ic<15> > p2;  
   cout << "p.is_number = " << p.is_number << endl;
   cout << "p2.is_number = " << p2.is_number  << endl;
   cout << "p2.getN() = " << p2.getN() << endl;
   return 0;
}
于 2012-08-15T06:27:31.727 に答える