I am receiving the following compile errors:

BinarySearchTree.cpp:3: error: expected constructor, destructor, or type conversion before â<â token
BinarySearchTree.cpp:9: error: expected initializer before â<â token
BinarySearchTree.cpp:15: error: expected initializer before â<â token
BinarySearchTree.cpp:21: error: expected initializer before â<â token

Looking at my implementation, I fail to see the errors. I wonder if overloading the methods is the problem or not. Here is the rest of my code:

#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H
#include <cstdlib>
#include <functional>

template <class T, class Key = T, class Compare = std::less<Key> >
class BinarySearchTree
{
	private:
		struct BinaryNode
		{
			T data;
			Key key;
			BinaryNode *left;
			BinaryNode *right;
			BinaryNode() : {left = NULL; right = NULL;}
			BinaryNode(Key k, T i) : data(i), key(k) {left = NULL; right = NULL;}
			~BinaryNode() : {delete left; delete right;}

		};
		BinaryNode *root;
		
		Compare compare;
	
	public:
		BinarySearchTree();
		void InsertSorted(const T& data);
		void InsertSorted(const Key& key, const T& data);
	
	private:
		void InsertSortedR(const Key& key, const T& data, BinaryNode*& node);
};

#include "BinarySearchTree.cpp"

#endif
template <class T, class Key, class Compare>
BinarySearchTree<T, Key, Compare>::BinarySearchTree() 
{
	root = NULL;
}

template <class T, class Key, class Compare>
void BinarySearchTree<T, Key, Compare>::InsertSorted(const T& item)
{
	InsertSorted(item, item);
}

template <class T, class Key, class Compare>
void BinarySearchTree<T, Key, Compare>::InsertSorted(const Key& key, const T& item)
{
	InsertSortedR(key, item, root);
}

template <class T, class Key, class Compare>
void BinarySearchTree<T, Key, Compare>::InsertSortedR(const Key& key, const T& item, BinaryNode*& node)
{
	// Base case: Reached end of list, or found sorted position
	if (node == NULL || compare(key, node->key))
	{
		// Create new list node
		BinaryNode *new_node = new BinaryNode(key, item);
		//new_node->next = node;
		
		// Update linked list
		node = new_node;
		
		if (root == NULL) // if list was empty, update tail
		{
			root = new_node;
		}
	}
	// Recursive case:
	else
	{
		InsertSortedR(key, item, node->right);
	}
}

If anyone could please help me with this error it would be greatly appreciated. Thanks in advance.

Recommended Answers

All 3 Replies

You can put the BinaryNode struct outside of the class and make the class look a little more cleaner.

Why are you including the .cpp file, it's not a header?

Shouldn't the destructor test if the pointers are NULL first?

First off I am going to deal with the minor errors. The the major problem.

Number of minor errors:

(A) Only constructors take the ":" assignment . Error in line 18 in
destructor. It should read ~BinaryNode() {delete left; delete right;} (B) Maybe delete line Compare compare . Use it as a direct functor if (node == NULL || Compare()(key, node->key)) Major:

This code is unlikely to behave as expected. If you put say in keys
3,5,1 then when it inserts a new node, it does no re-attach the
existing items to the tree. (as well as not working, this is a memory leak)

Additionally, I feel that you are being let down by your compiler. It is not reporting useful error messages. It really helps to have another compiler sometime (e.g. gcc) [likewise if you use gcc most of the time, something like Portland or IBM etc].

Finally, it is strange to include the .cpp file in the .h file. That is because you want to use the header without including all the code. If you need a template instance, then sometimes it needs to be done
but not all the time.

I look forward to the next installment :)

So the problem was part (A). Removed the colons and the code works. It might not be perfect, but it is functional. I included the cpp in the h file due to laziness. I used this class previously so there was not much to change. I've tried using Microsoft based compilers, but they have issues compiling my code where gcc finds no faults. I need to look into other compilers. Thanks for the help everyone!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.