2013-03-22 76 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

相關問題