C++ C++;typename嵌套类模板

C++ C++;typename嵌套类模板,c++,class,templates,iterator,typename,C++,Class,Templates,Iterator,Typename,我在二叉树上迭代时遇到了以下模板类,它有一个用于迭代器的内部类模板: template <typename T> struct BinaryTree { Node<T>* root = nullptr; explicit BinaryTree(Node<T>* const root) : root{ root }, pre_order{ *this } { root->set_tree(this); } ~Bina

我在二叉树上迭代时遇到了以下模板类,它有一个用于迭代器的内部类模板:

template <typename T> struct BinaryTree
{
  Node<T>* root = nullptr;

  explicit BinaryTree(Node<T>* const root)
    : root{ root }, pre_order{ *this }
  {
    root->set_tree(this);
  }

  ~BinaryTree() { if (root) delete root; }

  template <typename U>
  struct PreOrderIterator
  {
    Node<U>* current;

    explicit PreOrderIterator(Node<U>* current)
      : current(current)
    {
    }

    bool operator!=(const PreOrderIterator<U>& other)
    {
      return current != other.current;
    }

    // no continuations in C++ (unlike C#)
    PreOrderIterator<U>& operator++() 
    {
      if (current->right)
      {
        current = current->right;
        while (current->left)
          current = current->left;
      }
      else
      {
        Node<T>* p = current->parent;
        while (p && current == p->right)
        {
          current = p;
          p = p->parent;
        }
        current = p;
      }
      return *this;
    }

    Node<U>& operator*() { return *current; }
  };

  typedef PreOrderIterator<T> iterator;

  iterator end()
  {
    return iterator{ nullptr };
  }

  iterator begin()
  {
    Node<T>* n = root;

    if (n)
      while (n->left)
        n = n->left;
    return iterator{ n };
  }

};
模板结构二进制树
{
Node*root=nullptr;
显式二进制树(节点*常量根)
:root{root},前顺序{*this}
{
根->设置树(此);
}
~BinaryTree(){if(root)delete root;}
模板
结构预排序器
{
节点*电流;
显式预排序器(节点*当前)
:当前(当前)
{
}
布尔运算符!=(常量预排序器和其他)
{
返回电流!=other.current;
}
//在C++中没有连续性(不像C ^)
预排序器和运算符++()
{
如果(当前->右侧)
{
当前=当前->右侧;
while(当前->左)
当前=当前->左侧;
}
其他的
{
节点*p=当前->父节点;
while(p&¤t==p->right)
{
电流=p;
p=p->parent;
}
电流=p;
}
归还*这个;
}
节点和运算符*(){return*current;}
};
typedef预排序迭代器;
迭代器结束()
{
返回迭代器{nullptr};
}
迭代器begin()
{
节点*n=根;
如果(n)
同时(n->左)
n=n->左;
返回迭代器{n};
}
};
但是我不明白为什么为迭代器创建一个额外的内部类模板是有益的:迭代器的类型名不总是t吗,这使得额外的模板是多余的


这种方法是否有我没有的优势?

这是一些可疑的代码。当您从PreOrderWriter中删除模板时发生了什么?我同意:
PreOrderWriter
根本没有明显的理由成为成员模板。@Eljay当我删除模板时,它仍然以完全相同的方式运行。这是一些可疑的代码。当您从PreOrderWriter中删除模板时发生了什么?我同意:
PreOrderWriter
完全没有明显的理由成为成员模板。@Eljay当我删除模板时,它仍然以完全相同的方式运行。