为通用数据类型创建自己的迭代器

时间:2014-06-18 07:07:21

标签: c++ templates iterator

我无法理解为什么我的代码无法编译。

template<class Priority,class T> class PriorityQueue {
public:
  class Iterator;
  //some methods
  Iterator begin() const;
  Iterator end() const;
};

然后在Iterator类中:

template<class Priority,class T>
class PriorityQueue<Priority,T>::Iterator {
   //implement ctor,operator++,==etc.

我得到的几乎所有84个错误都与这些功能有关:

template<class Priority,class T>
Iterator<Priority,T> PriorityQueue<Priority,T>::begin() const{
    return Iterator<Priority,T>(firstNode);
}
template<class Priority,class T>
Iterator<Priority,T> PriorityQueue<Priority,T>::end() const{
    return Iterator<Priority,T>(nullptr);
}

错误是:错误2错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int。并且:错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int和:错误1错误C2143:语法错误:缺少&#39 ;;&#39;之前&#39;&lt;&#39; 所有关于方法begin()和end()(在他们的第一行Iterator PriorityQueue :: begin())。 编辑:我尝试使用typename,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

template<class Priority, class T> class PriorityQueue {
  class Iterator {
    //implement ctor,operator++,==etc.
  };

public:
  typedef Iterator iterator;
  //some methods//implement ctor,operator++,==etc.
  Iterator begin() const;
  Iterator end() const;
};

template<class Priority,class T>
typename PriorityQueue<Priority, T>::iterator 
PriorityQueue<Priority,T>::begin() const    {
    return Iterator(); // return right staff
}

template<class Priority,class T>
typename PriorityQueue<Priority, T>::iterator
PriorityQueue<Priority,T>::end() const{
    return Iterator(); // return right staff
}
  • 我建议您声明/定义Iterator private,并通过typedef提供访问权限,就像STL所做的那样。

DEMO