input_iterator询问模板名称

时间:2013-09-17 09:02:26

标签: c++ iterator

我一直在尝试编译下面的代码,但显示错误。我不确定它所期望的模板名称。我是新手,这是一个非常古老的代码,它正在新的g ++编译器上编译。有人可以帮忙吗?

提前致谢,谢谢。

错误:

./dir.h:12: error: expected template-name before â<â token
./dir.h:12: error: expected â{â before â<â token
./dir.h:12: error: expected unqualified-id before â<â token
make: *** exit code 1 making Life.o

代码:

#if !defined(DIRECTORY_H)
#define DIRECTORY_H
#include <string>
#include <algorithm>
#include <iterator>

//using std::input_iterator;

using std::string;

    struct dir_it_rep;
    class dir_it : public input_iterator<string,int>  //<------- Line 12
    {
    public:
      dir_it();                              // "past the end" ctor
      explicit dir_it(string const &);       // the "normal" ctor
      dir_it(dir_it const &it);
      ~dir_it();

      dir_it &operator= (dir_it const &it);

      string operator* () const { return i_value; }

      dir_it &operator++ ();
      dir_it operator++ (int) { dir_it rc (*this); operator++(); return rc; }

      bool operator== (dir_it const &it) const;
      bool operator!= (dir_it const &it) const { return !operator== (it); }

    private:
      dir_it_rep *i_rep;    // representation for the next value
      string     i_value;   // the current value
    };




#endif /* DIRECTORY_H */

1 个答案:

答案 0 :(得分:0)

第一:没有std::input_iterator。第二:迭代器是通过概念而不是通过类层次结构来解除的  标准库提供了基类std::iterator,为迭代器提供了一个通用的兼容接口(换句话说,为了简化)。 但是,不同类型的迭代器只是您自己的迭代器实现必须满足的属于特定迭代器类别的概念

换句话说:不同的迭代器类别(Forward iterator,Input iterator,Bidirectional Iterator)只是类概念。也就是说,例如,如果您想编写一个您想要被视为前向迭代器的类,那么您的类必须满足一系列条件/特征:

  • 您的课程必须为default constructible

  • 您的课程也必须符合InputIterator concept

  • 必须超载符合一组指定行为的preincrement和postincrement运算符(阅读文档)。

  • 该类必须是可解除引用的,即重载operator*()

Here是解释ForwardIterator概念的重要性的文档。

此外,标准库提供了一组充当&#34;标签&#34;确定迭代器类的类别(因为迭代器不是类层次结构,我们需要一个间接形式来确定迭代器的类别。请注意,在常见情况下这并不令人担心,因为我们在泛型中使用迭代器方式):http://en.cppreference.com/w/cpp/iterator/iterator_tags

阅读有关the iterators library的文档。它提供了关于迭代器,它的dessign及其概念的很好的解释。