好吧,所以我正在尝试创建一个(现在)不平衡的二叉树。我得到一个奇怪的错误,我似乎无法摆脱。下半场有同样的错误,所以我现在就摆脱它。
void insert( binTreeNode < T >*& node, const T& obj) { // private version of insert( )
if (obj < node->data) {
if(node->left != NULL)
insert(node->left, obj);
else {
binTreeNode<T> n;
n = new binTreeNode(obj, NULL, NULL);
node->left = n;
}
} else {
if(node->right != NULL)
insert(node->right, obj);
else {
}
}
}
错误
In file included from ../src/binTree.cc:2:0:
../src/binTree.h: In member function 'void binTree<T>::insert(binTreeNode<T>*&, const T&)':
../src/binTree.h:54:16: error: expected type-specifier before 'binTreeNode'
../src/binTree.h:54:16: error: expected ';' before 'binTreeNode'
src/subdir.mk:24: recipe for target `src/binTree.o' failed
make: *** [src/binTree.o] Error 1
binTreeNode的构造函数定义为
binTreeNode (const T& obj, binTreeNode < T >* leftObj = NULL, binTreeNode < T >* rightObj = NULL) {
left = leftObj;
right = rightObj;
data = obj;
}
感谢您的帮助。
答案 0 :(得分:3)
n = new binTreeNode(obj, NULL, NULL);
应该是
n = new binTreeNode<T>(obj, NULL, NULL);
(另外,n应该是一个指针)。
类不会从构造函数中自动调制模板参数,即使它是明确的。我不知道为什么。也许这样,如果你添加另一个构造函数,代码就不会变脆。
无论如何,如果这真的让你烦恼,你总是可以添加帮助函数:
template<typename T>
binTreeNode<T>* newBinTreeNode(const T& obj, binTreeNode<T>* left, binTreeNode<T>* right) {
return new binTreeNode<T>(obj, left, right);
}
答案 1 :(得分:0)
在类声明之外定义成员函数时,必须在insert()
的定义之前加上template<..>
前缀:
template <typename T>
void binTree<T>::insert(binTreeNode < T >*& node, const T& obj) {
if (obj < node->data) {
if(node->left != NULL)
insert(node->left, obj);
else {
binTreeNode<T> n;
n = new binTreeNode(obj, NULL, NULL);
node->left = n;
}
} else {
if(node->right != NULL)
insert(node->right, obj);
else {
}
}
}