ошибка компиляции при возврате указателя

У меня есть класс BST такой же, как в эта тема

BST.hpp

template<class T> 
class BinarySearchTree
{
 private:
  struct tree_node
  {
    tree_node* left;
    tree_node* right;
    T data;

    tree_node( const T & thedata, tree_node * l = NULL, tree_node * r = NULL )
            : data( thedata ), left( l ), right( r ) { }
  };
tree_node* root;

public:
  //some functions
private:
  struct tree_node* minFunc( tree_node** node);
};

Я пытался вернуть указатель из функции, как это сделано в эта ветка.

определение minFunc находится в том же файле BST.hpp

template <class T>
struct tree_node* BST<T>::minFunc(tree_node** node)
{
tree_node* current = *node;
while(current->left != NULL)
{
    current = current->left;
}
return current;
}

Не удалось выяснить ошибки компиляции:

ошибка C2143: синтаксическая ошибка: отсутствует ';' до '*'

ошибка C2065: 'T': необъявленный идентификатор

ошибка C2955: 'BST': использование шаблона класса requires список аргументов шаблона

ошибка C2509: «minFunc»: функция-член не объявлена ​​​​в «BST»

все это указывает на определение


person Kaushik Acharya    schedule 29.05.2011    source источник
comment
вероятно пропавший ; все портит   -  person BlackBear    schedule 29.05.2011
comment
Вы включили файл заголовка для BST в .cpp?   -  person Node    schedule 29.05.2011
comment
@BlackBear Нет пропавших без вести ;, компилятор вводит в заблуждение.   -  person cnicutar    schedule 29.05.2011
comment
@Node, поскольку это шаблонный класс, весь код находится в одном файле .hpp.   -  person Kaushik Acharya    schedule 29.05.2011


Ответы (3)


  1. Измените это объявление:

    struct tree_node* minFunc(tree_node** node);

в это

tree_node* minFunc( tree_node** node);

Измените его определение соответственно.

  1. Двойной указатель — верный признак плохого дизайна
  2. Вы включили заголовок, определяющий struct tree_node?

ИЗМЕНИТЬ

Определение должно быть

template <class T>
typename BST<T>::tree_node* BST<T>::minFunc(tree_node** node)
{
tree_node* current = *node;
while(current->left != NULL)
{
    current = current->left;
}
return current;
}

кстати, обратите внимание, что метод minFunc является приватным и не может получить к нему доступ вне класса

person BЈовић    schedule 29.05.2011
comment
удаление структуры дает C4430 в определении. @2. Я поместил все в тот же файл .hpp. - person Kaushik Acharya; 29.05.2011
comment
@Kaushik Вы поместили определение tree_node перед классом BinarySearchTree? - person BЈовић; 29.05.2011
comment
определение tree_node находится внутри класса BinarySearchTree. Я разместил код в теме. - person Kaushik Acharya; 30.05.2011
comment
правильный. 1. Я пропустил название типа в определении функции. 2. Что касается частного члена, мое намерение похоже на ссылка на эту тему. - person Kaushik Acharya; 30.05.2011

Я думаю, что struct tree_node не видно. Вероятно, он не объявлен/объявлен внутри какого-либо класса.

person cnicutar    schedule 29.05.2011
comment
это частный член класса BST, и весь код находится в файле .hpp. Это все еще проблема? - person Kaushik Acharya; 29.05.2011

treenode - это частная структура в BST - вы не можете получить к ней доступ за пределами BST

person slashmais    schedule 29.05.2011