1

クラスを使用したC++部分テンプレートの特殊化を試しています。問題は、セマンティクスよりも構文に関するものです。実際、私は次のようなものが必要です。

int main()
{
   ...
   Reduce<int, float> r(new int, new float);
   Reduce<int> r2(new int); // partial template specialization?
   ...
}

上記を達成するために私は試しました:

template <typename T, typename U>
class Reduce {
  public:
    Reduce(T *t, U *u) { }
};

template <typename T>
class Reduce<T,T> {
  public:
    Reduce(T *t) { }
};

上記のコードでは、次のステートメントを使用できません。

Reduce<int> r2(new int); // error: wrong number of template arguments (1, should be 2)

それでも私はしなければなりません:

Reduce<int, int> r2(new int); 

誰かが説明できますか:(1)希望する構文をどのように達成できますか(可能な場合)(2)不可能な場合、なぜですか?(つまり、技術的な問題)

4

3 に答える 3

5

2番目のテンプレートタイプのデフォルトタイプを指定します。

template <typename T, typename U = int>
class Reduce {
  public:
    Reduce(T *t, U *u) { }
};

または、デフォルトで最初のテンプレートタイプと同じになります。

template <typename T, typename U = T>
class Reduce {
  public:
    Reduce(T *t, U *u) { }
};

たとえば、http://ideone.com/5RcEGを参照してください。

于 2012-07-02T10:52:25.630 に答える
4

最終的に何が必要かによって、これが解決策になる場合とそうでない場合がありますが、少なくとも次のようにコンパイルされます。

template <typename... T>
class Reduce;

template <typename T, typename U>
class Reduce<T,U> {
  public:
    Reduce(T *t, U *u) { }
};

template <typename T>
class Reduce<T> {
  public:
    Reduce(T *t) { }
};

int main()
{
   Reduce<int, float> r(new int, new float);
   Reduce<int> r2(new int); // partial template specialization?
}
于 2012-07-02T10:54:14.063 に答える
0

テンプレート宣言から

template <typename T>
class Reduce<T,T> {
  public:
    Reduce(T *t) { }
};

Reduceには2つのテンプレート引数を指定する必要があることがわかります。だからあなたの使い方も変えてください

Reduce<int,int> r2(new int)
于 2012-07-02T10:50:10.977 に答える