Ich implementiere eine Hash-Tabelle und verknüpfte Liste in C++ (keine STL - fragen Sie nicht) unter Verwendung von Vorlagen, und ich bin in Probleme, die Verknüpfung von ihnen mit G++. Wenn ich #include alle meine .cpp-Dateien zusammen, alles funktioniert, so dass mein Code definitiv funktioniert, es ist nur die Verknüpfung, die mich stolpern oben ist.
Ich lese der Abschnitt im GCC-Handbuch über die Instanziierung von Vorlagen aber ich war nicht sicher, wie ich es anwenden sollte.
Mein Problem: Ich habe eine HashMap<T>
y HashEntry<T>
für meine Hashtabelle ( <T>
ist der Wert - meine Schlüssel sind std::string
s). Meine verknüpfte Liste hat LinkedList<T>
y Node<T>
(donde <T>
ist der Wert).
In meiner Rautenkarte habe ich:
template <class T> class HashMap {
...
private:
LinkedList< HashEntry<T> >** buckets;
}
Dadurch erhalte ich eine verknüpfte Liste von HashEntry<T>
s.
In einer separaten Datei habe ich meine Deklaration der Klasse Linked List:
template <class T>
class Node {
...
private:
T data;
}
template <class T> class LinkedList {
...
private:
Node<T> * first;
}
Wenn ich dann versuche, alles zu verknüpfen (nach dem Kompilieren mit g++ -c -frepo *.cpp
), bekomme ich:
g++ -frepo -o app LinkedList.o HashMap.o
[...unrelated errors about not having a main method - they go away when I link that in]
HashMap.o: In function `HashMap<int>::~HashMap()':
HashMap.cpp:(.text._ZN7HashMapIiED1Ev[HashMap<int>::~HashMap()]+0x65): undefined reference to `LinkedList<HashEntry<int> >::~LinkedList()'
HashMap.o: In function `HashMap<int>::insert(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
HashMap.cpp:(.text._ZN7HashMapIiE6insertESsi[HashMap<int>::insert(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)]+0xff): undefined reference to `Node<HashEntry<int> >::setData(HashEntry<int>)'
Beim Herumgoogeln habe ich Vorschläge für die Deklaration der expliziten Vorlagentypen gesehen, die mein Programm verwendet. Dies funktioniert für die HashMap
y HashEntry
(Ich fügte hinzu ( template class HashMap< int >
y template class HashEntry< int >
.
Ich kann jedoch nicht herausfinden, wie ich das für LinkedList
y Node
Klassen, da die Template-Instanzen von HashEntries<int>
. ABER, ich kann das nicht in die LinkedList.h
Datei, da es sich um #include
d durch meine Hash-Tabellen. Ich konnte auch nicht bekommen, eine erweiterte/externe Erklärung arbeiten für sie.
Ich bin sicher, dass ich etwas ganz Einfaches übersehe, damit das alles funktioniert. Irgendwelche Tipps?