Шаблон бинарного дерева поиска C ++ возвращает узел из функции - PullRequest
4 голосов
/ 27 января 2020

У меня есть следующий класс BinaryTree, который включает в себя закрытый класс с именем Node (я пропустил все, кроме того, что необходимо для этого вопроса):

template<typename T>
class BinaryTree{
private:
    template<typename NT>
    class Node{
    public:
        Node<NT>* left;
        Node<NT>* right;
        NT item;
    };
public:
    Node<T> Find(T itemToFind);
};

, что является довольно стандартным. Я пытаюсь реализовать функцию Node FindMax(), которая возвращает объект Node, и я не могу понять, как его определить. Например, я предположил (неправильно), что этого будет достаточно:

template<typename T>
Node<T> BinaryTree<T>::Find(T itemToFind){ // -------> error line
    //...do something....
}

, но я получаю сообщение об ошибке: No template named Node. Я пробовал различные другие комбинации безрезультатно. Я не собираюсь возвращать bool, если найден, я хочу вернуть Node сам.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Вам необходимо добавить оператор области действия ::, поскольку класс Node является частью класса BinaryTree:

template<typename T>
BinaryTree<T>::Node<T> BinaryTree<T>::Find(T itemToFind) {
    //...do something....
}

C ++ 14 представил auto тип возвращаемого значения, поэтому следующее будет работа тоже:

template<typename T>
auto BinaryTree<T>::Find(T itemToFind) {
    //...do something....
}
2 голосов
/ 27 января 2020

В этот момент класс Node не находится в области видимости. Вам нужно сделать что-то вроде этого:

template<typename T>
BinaryTree<T>::Node<T> BinaryTree<T>::Find(T itemToFind) { 
    //...do something....
}

Это было одним из мотивов для конечных типов возврата C ++ 11, которые позволяют вам сократить тип возврата. IIR C, конечный тип возврата для функций-членов оценивается в области видимости класса.

template<typename T>
BinaryTree<T>::Find(T itemToFind) -> Node<T> { 
    //...do something....
}

Кстати, вы действительно хотите, чтобы класс Node имел параметр шаблона, который не зависит от параметр шаблона для BinaryTree? То есть вы можете исключить второй параметр шаблона NT.

...