Hallo, folgendes Problem: Ich habe eine Klasse für Baumknoten deren Key ich variabel halten möchte: template<class TKey> class MyCNode { ... } Ein Anwender kann diese Klasse als Basisklasse für seine Daten verwenden. Der Baum sieht nun wie folgt aus: template<template<class TKey>class MyCNode> class MyCTree { ... } Wenn ich jetzt in der Klasse eine Methode deklariere, so kennt er laut Meldung TKey nicht: int insertNode(MyCNode<TKey>* const pNode); Wie würdet ihr das Interface der Baumklasse gestalten, um zu erzwingen, dass nur von MyCNode abgeleitete Klassen als Templateargument akzeptiert werden? Gruß, Alex
Versuchs mal so: template<class MyCNode> class MyCTree { ... } MyNode kann ja alles mögliche sein, was will der Compiler erst man garnicht wissen.
Ich will aber nicht sagen: Hier ist eine Baumklasse die irgendeinen Template-Parameter hat. Sondern: Hier ist eine Baumklasse, die als Template-Parameter den Typen MyCNode (oder eine davon abgeleitete Klasse) mit dem Template-Parameter TKey hat.
1 | template<class TKey> class Node |
2 | {
|
3 | ...
|
4 | };
|
5 | |
6 | class Tree |
7 | {
|
8 | public:
|
9 | void addNode(Node& newNode); |
10 | };
|
Mehr ist eigentlich nicht nötig. Tree braucht keinen Templateparameter
Ganz so einfach ists leider nicht :-)
1 | class Tree |
2 | {
|
3 | public:
|
4 | void getNode(TKey Key, Node& existingNode); |
5 | };
|
Da brauchts TKey dann doch. Gruß, Alex
1 | template<class TKey> class MyCNode |
2 | {
|
3 | public:
|
4 | typedef TKey KeyType; |
5 | }
|
6 | |
7 | template<typename Node> |
8 | class Tree |
9 | {
|
10 | public:
|
11 | void getNode(Node::KeyType Key, Node& existingNode); |
12 | };
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.