With extraneous code removed, your problem simplifies to

Code:

template <typename T>
class Node
{
protected:
size_t size;
};
template <typename T>
class BinaryTreeNode : public Node<T>
{
public:
BinaryTreeNode()
{
size = 0;
}
};

When you remove the templates, the code compiles.

Code:

//template <typename T>
class Node
{
protected:
size_t size;
};
//template <typename T>
class BinaryTreeNode : public Node//<T>
{
public:
BinaryTreeNode()
{
size = 0;
}
};

On a hunch, using

in the original version works. Don't ask me why, I'm a C programmer.

In short, for some reason, you want

Code:

template <typename T>
class BinaryTreeNode : public Node<T>
{
public:
BinaryTreeNode() : Node<T>(2) { }
BinaryTreeNode(T x) : Node<T>(2, x) { }
~BinaryTreeNode()
{
delete Node<T>::child[0];
delete Node<T>::child[1];
}
};