C++ 超载<&书信电报;运营商作为一个;“朋友”;用于打印BST-C++;

C++ 超载<&书信电报;运营商作为一个;“朋友”;用于打印BST-C++;,c++,operator-overloading,binary-search-tree,C++,Operator Overloading,Binary Search Tree,我试图重载,而不是 ostream& operator<<(ostream &out, const WordTree& rhs) { out << InOrder(&out, rhs.root); return out; } 而不是 ostream& operator<<(ostream &out, const WordTree& rhs) { out << InOr

我试图重载
,而不是

ostream& operator<<(ostream &out, const WordTree& rhs)
{
    out << InOrder(&out, rhs.root);
    return out;
}
而不是

ostream& operator<<(ostream &out, const WordTree& rhs)
{
    out << InOrder(&out, rhs.root);
    return out;
}
我可以用什么方法解决这个问题

这可能有点高级,但您提出了这个问题,下面是一个解决问题的可能方法:

inoorder
可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用

这尚未编译,但向您展示了顺序遍历的可能通用实现是什么样子,以及如何使用
操作符m_数据打印每个节点;计数+=cur->m_计数});
//..
标准::cout
我可以用什么方法解决这个问题

这可能有点高级,但您提出了这个问题,下面是一个解决问题的可能方法:

inoorder
可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用

这尚未编译,但向您展示了顺序遍历的可能通用实现是什么样子,以及如何使用
操作符m_数据打印每个节点;计数+=cur->m_计数});
//..

这不管用。我得到以下错误:
对象的类型限定符与成员函数“WordTree:inoorder”不兼容。对象类型是:const WordTree
@aelarabi,这很不幸
inoorder
应该是
const
成员函数。这不起作用。我得到以下错误:
对象的类型限定符与成员函数“WordTree:inoorder”不兼容。对象类型是:const WordTree
@aelarabi,这很不幸
inoorder
应该是一个
const
成员函数。inoorder可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用。InOrder可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用。
ostream& operator<<(ostream &out, const WordTree& rhs)
{
    out << InOrder(&out, rhs.root);
    return out;
}
ostream& operator<<(ostream &out, const WordTree& rhs)
{
    // Invoke InOrder on the WordTree object.
    // Use just out, not &out.
    return rhs.InOrder(out, rhs.root);
}
ostream& operator<<(ostream &out, const WordTree& rhs)
{
    // Invoke InOrder on the WordTree object.
    // Use just out, not &out.
    WordTree temp(rhs);
    return temp.InOrder(out, temp.root);
}
class WordTree
{
//...
public:
    // generic, templated inorder traversal function
    template <typename fn>
    void InOrder(WordNode *cur, fn predicate)
    {
       if ( !cur )
          return;
       InOrder(cur->m_left, predicate);

       // call the user-defined function
       predicate(cur);

       InOrder(cur->m_right, predicate);
    }

    friend std::ostream& operator<<(std::ostream &out, const WordTree& rhs);
    //...
};    
    // A helper functor to print one node
    struct NodePrinter
    {
      std::ostream* strm;

      // Initialize object with pointer to the stream
      NodePrinter(std::ostream* s) : strm(s) {}

      // function that is called by InOrder
      void operator()(WordNode *cur)
      {
         *strm << cur->m_data << " " << cur->m_count << "\n";
      }
   };

   std::ostream& operator<<(std::ostream &out, const WordTree& rhs)
   {
     // create instance of the functor 
     NodePrinter np(&out);
    // call the InOrder function (assume that get_root() returns the pointer to the root node)
     rhs.InOrder(rhs.get_root(), np);
     return out;
   }
std::string allNodes;
int count = 0;
//...
rhs.InOrder(rhs.get_root(), [&](WordNode *cur) { allNodes += cur->m_data; count += cur->m_count });
//..
std::cout << allNodes << "\n" << count;