私は、以下に示すように、テンプレートテンプレートがどのように同様の機能を実装するかについて頭を悩ましています。別のテンプレート引数を受け入れるテンプレートテンプレートコレクション
2つのクラス(Java)を考えてみましょう。最初のクラスは、第2のテンプレート引数のオブジェクトのみがそれに格納することができることを指定することによって、pack
メソッドによって返さ収集制限されていますのは、言わせて、ために
abstract class ContainerPacker<T, Container extends Collection<T>> {
abstract Container pack(T t);
}
そして、このクラスの実装を、Integer
タイプはその後になります
class IntegerContainerPacker extends ContainerPacker<Integer, List<Integer>> {
@Override
List<Integer> pack(Integer t) {
List<Integer> list = new ArrayList<>(t);
list.add(t);
return list;
}
}
今私はテンプレートテンプレートを使ってC++で同様のことをしたいと思います。
template <typename T, template <typename U> class Container>
class ContainerPacker {
public:
virtual Container<T> pack(T) = 0;
};
私もそれを実装するトラブルを抱えている:Container
は、テンプレートそのものであることに注目してください。以下のコードはコンパイルされません:
class IntegerVectorPacker : public ContainerPacker<int, std::vector> {
public:
std::vector<int> pack(int t) {
std::vector<int> v = std::vector<int>();
v.push_back(t);
return v;
}
};
エラーは以下のとおりです。
error: type/value mismatch at argument 2 in template parameter list for ‘template class Container> class ContainerPacker’ class IntegerVectorPacker : public ContainerPacker {
と
note: expected a template of type ‘template class Container’, got ‘template class std::vector’
私は答えを探してきたが、それも難しいのですがどのような質問を把握します聞く、質問する。テンプレートテンプレートは難しいです。
2番目のエラーは、 'std :: vector'というフルスペシャライゼーションを提供するのではなく、2番目のテンプレートパラメータとして 'std :: vector'を指定したことに関連しているようです。それは、テンプレートクラスを期待していたが、クラス名を指定したということです。 –
Howard