C++ C++;17迭代器';我没打电话

C++ C++;17迭代器';我没打电话,c++,c++17,C++,C++17,在定制的C++17迭代器改变了一些特性之后,我对它还是个新手。为了说明这个错误,下面是一个简单的代码来说明这个问题。据报,这是一个错误 auto[minu_it,max_it]=std::minmax_元素(r.begin(),r.end()) 找不到 前向迭代器标记 为什么会发生这种情况?我们怎样才能解决它?非常感谢 #include <iostream> class num_iterator { public: explicit num_iterator(int pos

在定制的C++17迭代器改变了一些特性之后,我对它还是个新手。为了说明这个错误,下面是一个简单的代码来说明这个问题。据报,这是一个错误

auto[minu_it,max_it]=std::minmax_元素(r.begin(),r.end())

找不到

前向迭代器标记

为什么会发生这种情况?我们怎样才能解决它?非常感谢

#include <iostream>

class num_iterator {
 public:
  explicit num_iterator(int pos = 0) : i{pos} {};
  int operator*() const {
      return i;
  }
  num_iterator &operator++() {
      ++i;
      return *this;
  }
  bool operator!=(const num_iterator &other) {
      return i != other.i;
  }
 private:
  int i;
};

class num_range {
 public:
  num_range(int from, int to) : a{from}, b{to} {};
  num_iterator begin() {
      return num_iterator{a};
  }
  num_iterator end() {
      return num_iterator{b};
  }
 private:
  int a{0};
  int b{0};
};


namespace std {
template<>
struct iterator_traits<num_iterator> {
  using iterator_cateory = std::forward_iterator_tag;
  using value_type = int;
};
}

int main() {
    for (int a:num_range(10, 20)) {
        std::cout << a << " ";
    }

    num_range r{100, 110};

    auto[min_it, max_it] = std::minmax_element(r.begin(), r.end());
    std::cout << *min_it << std::endl;
    std::cout << *max_it << std::endl;

    return 0;
}
#包括
类num_迭代器{
公众:
显式num_迭代器(intpos=0):i{pos}{};
整型运算符*()常量{
返回i;
}
num_迭代器和运算符++(){
++一,;
归还*这个;
}
布尔运算符!=(常量数值迭代器和其他){
返回i!=其他。i;
}
私人:
int i;
};
类数范围{
公众:
num_范围(int-from,int-to):a{from},b{to};
num_迭代器begin(){
返回num_迭代器{a};
}
num_迭代器end(){
返回num_迭代器{b};
}
私人:
int a{0};
int b{0};
};
名称空间标准{
模板
结构迭代器{
使用迭代器\u caterory=std::forward\u迭代器\u标记;
使用value_type=int;
};
}
int main(){
用于(整数a:num_范围(10,20)){

std::cout在这种特定情况下,编译器会抱怨您的自定义迭代器缺少
运算符==

  bool operator==(const num_iterator& other){
      return !(*this != other);
  }

另一个具体问题是您拼写错误了
iterator\u category

using iterator_category = std::forward_iterator_tag;
一般来说,定义自己的迭代器并不总是非常简单。根据迭代器类型的不同,有许多必需的操作。我建议使用

问题已经解决了

前向迭代器需要一些您尚未提供的其他功能,例如:

  • 您缺少
    指针的类型特征
    差异类型
    ,而
    引用
    的类型特征必须是
    常量&
  • 您需要前缀和后缀增量运算符
  • 您需要
    操作符==
    操作符!=
    (如上所述)
  • 您还缺少
    操作员->

我遗漏了什么吗?即使我添加了它,它似乎也不起作用。我复制粘贴了演示,下面是错误消息…/XcodeDefault.xctoolchain/usr/bin/。/include/c++/v1/算法:2632:19:注意:在函数模板专门化的实例化中,这里请求的“std::\uu 1::minmax\u元素”返回\u VSTD::minmax\u元素(uuu first,uuuu last,^/Temp/cppplayder/main.cpp:54:31:注意:在函数模板专门化的实例化中,此处请求自动[minu-it,max-it]=std::minmax-u元素(r.begin(),r.end());