Ich versuche, meinen Kopf darum zu wickeln, wie Vorlagenvorlagen funktionieren, um eine ähnliche Funktionalität zu implementieren, wie unten gezeigt.Vorlagenschablonen-Sammlung, die ein anderes Vorlagenargument akzeptiert
Betrachten Sie zwei Klassen (in Java). Die erste Klasse ist die Sammlung von pack
-Methode zurück Begrenzung durch die Angabe, dass nur ein Objekt der zweiten Template-Argument kann darin gespeichert werden: für
abstract class ContainerPacker<T, Container extends Collection<T>> {
abstract Container pack(T t);
}
und Implementierung dieser Klasse, sagen wir mal, könnte Integer
Typ dann aussehen wie folgt:
class IntegerContainerPacker extends ContainerPacker<Integer, List<Integer>> {
@Override
List<Integer> pack(Integer t) {
List<Integer> list = new ArrayList<>(t);
list.add(t);
return list;
}
}
Jetzt möchte ich etwas ähnliches in C++ mit Vorlagenvorlagen tun. Beachten Sie, wie die Container
ist eine Vorlage selbst: wenn
template <typename T, template <typename U> class Container>
class ContainerPacker {
public:
virtual Container<T> pack(T) = 0;
};
Ich habe Probleme, es zu implementieren. Der folgende Code nicht kompiliert:
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;
}
};
Die Fehler sind:
error: type/value mismatch at argument 2 in template parameter list for ‘template class Container> class ContainerPacker’ class IntegerVectorPacker : public ContainerPacker {
und
note: expected a template of type ‘template class Container’, got ‘template class std::vector’
Ich habe nach einer Antwort gesucht, aber es ist auch schwierig, herauszufinden, was Frage Fragen. Vorlagenvorlagen sind schwer.
Der zweite Fehler, den Sie erwähnen, scheint damit zu tun zu sein, dass Sie 'std :: vector' als zweiten Template-Parameter angeben, anstatt die Vollspezialisierung anzugeben, die' std :: vector 'ist. Es wird gesagt, dass es eine Vorlagenklasse erwartet, aber Sie haben einen Klassennamen angegeben. –
Howard