Haben Sie Probleme zu verstehen, wie (und warum) diese Konvertierung nicht funktioniert.C++ - Vorlagen und Polymorphie keine brauchbare benutzerdefinierte Konvertierung
I haben Klasse A, Klasse B von der Klasse A abgeleitet ist, und der Klasse C von Klasse B. abgeleitet
class A {};
class B : public A {};
class C : public B {};
Ich möchte ein HashTable machen, die zwei Schablonen typenames <K, V>
hat, wo der K a char und V ist eine binäre Suchbaum-Vorlagenklasse (BST<T>
). Diese BSTs haben die Typen A
, B
und C
.
template <typename K, typename V>
class HashTable {
public:
bool put(K key, V value); // adds key value pair to table
private:
V* table; // table stores values
int size; // size of table
};
template <typename T>
class BST {
public:
bool insert(T item); // adds item to tree
private:
struct BSTNode { // node structure
R data; // item data
BSTNode *left; // left child pointer
BSTNode *right; // right child pointer
};
BSTNode *root; // pointer to root of tree
};
Der folgende Code hat einen Fehler mit einem BST<C>
in der Hash-Tabelle setzen, weil es nicht von BST<C>
zu BST<A>
umwandeln kann. Die letzte Zeile in main ist jedoch legal.
int main() {
HashTable<char, BST<A>> inventory;
BST<C> foo;
inventory.put('C', foo);
A *bar= new C();
}
ich aber wegen Polymorphismus, BST<C>
is-a BST<A>
? Wie kann ich diesen Typunterschied umgehen, damit ich BST, BST und BST zu meinem hashmap hinzufügen kann?
Ich habe bereits versucht mit typedef in der Deklaration und das hat nicht funktioniert.
Sieht so aus, als würden Sie 'A' in Ihrem benutzerdefinierten Container speichern, wodurch die Unterklasse entfernt wird. –
Warten Sie ... was? Das ist der falsche Betrogene. Die damit verbundene Frage hat damit nichts zu tun. Stimme, um wieder zu öffnen. –
@SamVarshavchik, total falsch dupe. – SergeyA