简体   繁体   English

“struct std::iterator_traits”中没有名为“iterator_category”的类型<int* const> '</int*>

[英]No type named 'iterator_category' in 'struct std::iterator_traits<int* const>'

I'm writing a custom vector class:我正在编写一个自定义向量 class:

#include <iterator>

template <typename T>
class vector {
 public:
  using value_type = T;
  using pointer = value_type*;
  using iterator = pointer;
  using const_iterator = const iterator;
  using const_reverse_iterator = std::reverse_iterator<const_iterator>;

  auto crbegin() const -> const_reverse_iterator {
    return const_reverse_iterator(data_);
  }

 private:
  pointer data_{};
};

int main(int argc, char* argv[]) {
  vector<int> v;
  auto i = v.crbegin();

  return 0;
}

When compiling the code above, I get this error (on GCC and MSVC):编译上面的代码时,我收到此错误(在 GCC 和 MSVC 上):

error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<int* const>’

The error goes away when I change the reverse iterator definition to std::reverse_iterator<const T*> .当我将反向迭代器定义更改为std::reverse_iterator<const T*>时,错误消失了。 What's the difference compared to std::reverse_iterator<const_iterator> ?std::reverse_iterator<const_iterator>相比有什么区别?

The problem can be reduced to this:问题可以简化为:

#include <iterator>

template <typename T>
class vector {
 public:
  using value_type = T;
  using pointer = value_type*;
  using const_reverse_iterator = std::reverse_iterator<const pointer>;

  auto crbegin() const -> const_reverse_iterator {
    return const_reverse_iterator(data_);
  }

 private:
  pointer data_{};
};

int main() {
  vector<int> v;
  auto i = v.crbegin();
  (void) i;
  return 0;
}

And the error message from clang makes the nature of the problem clearer:而来自 clang 的错误信息让问题的本质更加清晰:

no type named 'reference' in 'std::iterator_traits<int *const>'
^^^^^^^^^^

And so we see that what you thought was a const *int (ie the pointed-to object is const ) is in fact a, int *const (ie the pointer itself is const ).因此我们看到您认为的const *int (即指向的 object 是const )实际上是一个int *const (即指针本身是const )。

Here's a fix:这是一个修复:

#include <iterator>

template <typename T>
class vector {
 public:
  using value_type = T;
  using pointer = value_type*;
  using const_pointer = const value_type*;
  using const_reverse_iterator = std::reverse_iterator<const_pointer>;

  auto crbegin() const -> const_reverse_iterator {
    return const_reverse_iterator(data_);
  }

 private:
  pointer data_{};
};

int main() {
  vector<int> v;
  auto i = v.crbegin();
  (void) i;
  return 0;
}

Live demo现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 遇到错误:“struct std::iterator_traits”中没有名为“iterator_category”的类型<std::vector<int> &gt; - Encountring error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<std::vector<int> > std::iterator_traits 中的 iterator_category 与 iterator_category() 有什么区别 - What is a difference between iterator_category vs iterator_category() in std::iterator_traits 铛错误:c ++ / 4.8 / bits / stl_iterator_base_types.h:227:29:错误:&#39;std :: iterator_traits中没有名为&#39;iterator_category&#39;的类型 <unsigned long> “ - clang error: c++/4.8/bits/stl_iterator_base_types.h:227:29: error: no type named 'iterator_category' in 'std::iterator_traits<unsigned long>' “struct std::iterator_traits”中没有名为“value_type”的类型 - no type named ‘value_type’ in ‘struct std::iterator_traits 在struct std :: iterator_traits &lt;...&gt;中没有名为“ pointer”的类型 - no type named ‘pointer’ in struct std::iterator_traits<…> C ++在&#39;struct std :: iterator_traits中没有名为&#39;value_type&#39;的类型 <int> “ - C++ no type named ‘value_type’ in ‘struct std::iterator_traits<int>' iterator_category&#39;:不是&#39;std :: iterator_traits &lt;_InIt&gt;&#39;的任何基类的成员 - iterator_category': is not a member of any base class of 'std::iterator_traits<_InIt>' std :: vector中没有名为iterator_category的类型 - No type named iterator_category in std::vector cpp std::copy 编译期间出现问题:在“struct std::iterator_traits”中没有名为“value_type”的类型<unsigned_char> - cpp std::copy problems during compilation : no type named 'value_type' in 'struct std::iterator_traits<unsigned_char> std::iterator_traits 中类型别名的“默认值”总是正确的吗? - Are the “defaults” for the type alises in std::iterator_traits always correct?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM