2021年3月12日星期五

C++ template instantiation, error: member of non-class type 'int'

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

没有评论:

发表评论