I am trying to implement a binary search tree in C++. I have run into a problem while recursively calling function Node<T>::append
in its own definition.
Here is a minimum reproducible example:
#include <iostream> #include <string> #include <memory> // std::unique_ptr<> using namespace::std; template<class T> class Node { public: // constructors Node() {}; Node(const T&); // operations void append(const T&); void print(); private: unique_ptr<T> value, left_child, right_child; }; template<class T> class BinaryTree { public: // constructors BinaryTree() {}; BinaryTree(const T&); // operations void insert(const T&); void output(); private: Node<T> root; int size; }; template<class T> Node<T>::Node(const T& in): value(new T (in)), left_child(nullptr), right_child(nullptr) {} template<class T> void Node<T>::append(const T& in) { if (in < *value) { if (left_child) left_child->append(in); else left_child(new Node(in)); } else if (in > *value) { if (right_child) right_child->append(in); else right_child(new Node(in)); } } template<class T> void Node<T>::print() { cout << string(6,' ') << "( " << *value << " ) " << endl; if (left_child) left_child->print(); if (right_child) { cout << string(10,' '); right_child->print(); } } template<class T> BinaryTree<T>::BinaryTree(const T& in): root(in), size(1) {} template<class T> void BinaryTree<T>::insert(const T& in) { root.append(in); } template<class T> void BinaryTree<T>::output() { root.print(); } int main() { BinaryTree<int> test(5); test.insert(3); test.insert(9); test.output(); return 0; }
g++ logs in the following error:
error: request for member 'append' in '*((Node<int>*)this)->Node<int>::left_child.std::unique_ptr<_Tp, _Dp>::operator-><int, std::default_delete<int> >()', which is of non-class type 'int' left_child->append(in);
I think the compiler sees the line left_child->append(in);
not as a recursive call but as some functor to a function that does not exist.
How can I solve this issue? See online compilation: https://godbolt.org/z/Pna9e5
https://stackoverflow.com/questions/66609320/c-template-instantiation-error-member-of-non-class-type-int March 13, 2021 at 09:36AM
没有评论:
发表评论