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.