C++ undefined reference to template class method
c++, templates, undefined-reference
Solution
Typically you want your template methods in the header, so they are compiled when needed. In case you really want to hide it in the implementation file, you have to explicitly instantiate the template in `Graph.cpp` like
template class Graph<string>;
Since you have to do that for every type `T` you intend to use with `Graph<T>`, the point of the template class is somewhat defeated and you better put everything into the header
Problem
I always get undefined reference to `Graph::InsertVertex(std::string)' if I compile my project! Any hints why he cant resolve this reference? (all Files are in the netbeans project folder) // main.cpp ``` #include <cstdlib> #include <string> #include "Graph.h" using namespace std; int main(int argc, char** argv) { Graph<string> *graph = new Graph<string>(); // <--- ERROR graph->InsertVertex("A"); return 0; } ``` // Node.h ``` #include <iostream> #include "Graph.h" template<class T> class Node { friend class Graph; public: Node(T val) { this->data = val; this->vertList = NULL; this->next = NULL; } Node(const Node& orig); virtual ~Node(); private: T data; Node<T> *vertList; Node<T> *next; int status; }; ``` // Graph.h ``` #include <iostream> #include "Node.h" template <class T> class Graph { public: Graph() { head = NULL; } void InsertVertex(T val); void InsertEdge(T v_val, T e_val); void PrintVertices(); void PrintEdges(T v_val); void DeleteEdge(T v_val, T e_val); void DeleteVertex(T val); void bfs(); private: Node<T> *head; }; ``` // Graph.cpp ``` #include "Graph.h" template <class T> void Graph<T>::InsertVertex(T val) { Node<T> *temp = new Node<T>(val); if(head == NULL) head = temp; else { Node<T> node = head; while(node->vertList != NULL) node = node->vertList; node->vertList = temp; } } template <class T> void Graph<T>::InsertEdge(T v_val, T e_val) { if (head != NULL) { Node<T> *k = head; Node<T> *t = head; Node<T> *temp = new Node<T> (e_val); while (t != NULL) { if (t->data == v_val) { Node<T> *s = t; while (s->next != NULL) s = s->next; s->next = temp; while (k != NULL) { if(k->data == e_val) break; k = k->vertList; } temp->vertList = k; return; } t = t->vertList; } // end while loop } else std::cout << "Add first vertices to the graph" << std::endl; } template <class T> void Graph<T>::PrintEdges(T v_val) { Node<T>* t = head; while (t != NULL) { if (t->data == v_val) { while (t->next != NULL) { std::cout << t->next->vertList->data << " "; t = t->next; } } t = t->vertList; } } template <class T> void Graph<T>::PrintVertices() { Node<T>* t = head; while (t != NULL) { std::cout << t->data << " "; t = t->vertList; } } ```