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

Да, это исправлено. Еще раз спасибо. К сожалению, мой инструктор очень специфичен в отношении того, какие функции мы можем иметь в наших назначениях, но я все равно пытаюсь сделать это. –

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 { 

     } 
    } 
} 
+0

Я сомневаюсь, что это проблема - от ошибок, компилятор понимает, что это определение 'недействительным binTree :: insert'. – ildjarn

+0

@ildjarn просто смущает OP, отправляющий частичный код, я думаю. Он даже не определяет 'insert' как функцию-член. Должно быть inline ... – Tushar

+0

Извините. В то время половина кода не была написана, но она действительно была встроенной. –

Смежные вопросы