Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a template class object using a template constructor

I'm having trouble creating a class object from a template class in which I need the constructor to also be a template and accept a parameter when the object is created. However, when I attempt to create the object, I receive an error message stating that I'm referencing something that doesn't exist.

Here's my code:

using namespace std;
#include <cstdlib>

template <class Node_Type>
class BinaryTree 
{
public:
    BinaryTree(Node_Type);
    BinaryTree(Node_Type, Node_Type);
    BinaryTree(Node_Type, Node_Type, Node_Type);
    bool isEmpty();
    Node_Type info();
    Node_Type inOrder();
    Node_Type preOrder();
    Node_Type postOrder();


private:
    struct Tree_Node
{
    Node_Type Node_Info;
    BinaryTree<Node_Type> *left;
    BinaryTree<Node_Type> *right;
};

Tree_Node *root;

};

#endif

and my .cpp:

template <class Node_Type>
BinaryTree<Node_Type>::BinaryTree(Node_Type rootNode) {

    root = rootNode;
    root->left = NULL;
    root->right = NULL;

}

There's more to the .cpp, but it's just other function members that are irrelevant. My constructor shown above is what I can't get to work.

In my main, I'm attempting to declare my object with the call:

BinaryTree<char> node('a');

but when I try this, I get an error message stating:

undefined reference to `BinaryTree<char>::BinaryTree(char)'

I've been trying to figure this out for two days now. I've Googled every topic I can think of and read countless examples on Stack Overflow and other sources with no help. Can anyone please explain what my problem is? I know how to do my project, and I'd be finished by now if the syntax wasn't so ridiculous in C++. Thanks in advance!

like image 419
Stephen Fish Avatar asked Sep 18 '13 19:09

Stephen Fish


1 Answers

Template code should be visible at the time of instantiation, meaning that the definition of the functions must also be in the header.

like image 150
stefaanv Avatar answered Sep 28 '22 02:09

stefaanv