2013-03-22 81 views
0

好的,所以我正在尝试制作(现在)不平衡的二叉树。我收到了一个我似乎无法摆脱的奇怪错误。下半场有同样的错误,所以我现在刚刚摆脱它。错误:预期在'模板'之前的主要表达式

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; 
} 

感谢您的帮助错误。

回答

3
 n = new binTreeNode(obj, NULL, NULL); 

应该

 n = new binTreeNode<T>(obj, NULL, NULL); 

(也正应成为一个指针)。

类不会从构造函数自动减少模板参数,即使它是明确的。我不知道为什么。也许这是为了让代码不会变得脆弱,如果你添加另一个构造函数。

无论如何,如果这真的是错误,你可以随时添加一个辅助函数:

template<typename T> 
binTreeNode<T>* newBinTreeNode(const T& obj, binTreeNode<T>* left, binTreeNode<T>* right) { 
    return new binTreeNode<T>(obj, left, right); 
} 
+0

是的,那修好了。再次感谢。不幸的是,我的导师非常关注我们在我们的作业中可以具备哪些功能,但是我仍然试着去做。 – 2013-03-23 18:55:25

0

类的声明之外定义成员函数时,必须与template<..>前缀之前的insert()定义:

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 { 

     } 
    } 
} 
+0

我怀疑这是问题 - 从错误中,编译器明白,这是'空二叉树定义:: insert'。 – ildjarn 2013-03-22 01:54:35

+0

@ildjarn只是混淆OP张贴部分代码,我猜。他甚至没有将'insert'定义为成员函数。必须内联... – Tushar 2013-03-23 16:35:19

+0

对不起。当时有一半的代码没有写入,但确实是内联的。 – 2013-03-23 18:51:43

相关问题