无法取消引用通用迭代器类型

时间:2019-07-29 07:33:51

标签: c++11 iterator

我只是试图构建一个涉及通用迭代器类型的东西,特别是一些链接迭代器的东西,但是我无法取消引用迭代器。 MVE:

#include <iterator>

#include <iterator>
#include <vector>

int main() {
    std::vector<int> a = {1};
    std::iterator<std::random_access_iterator_tag, int> my_iterator = a.begin();
    int my_int = *my_iterator;
    return 0;
}

错误:

iterator.cxx:6:57: error: no viable conversion from 'std::__1::vector<int, std::__1::allocator<int> >::iterator'
      (aka '__wrap_iter<int *>') to 'std::iterator<std::random_access_iterator_tag, int>'
    std::iterator<std::random_access_iterator_tag, int> my_iterator = a.begin();
                                                        ^             ~~~~~~~~~
/Applications/Xcode-9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:531:29: note: 
      candidate constructor (the implicit copy constructor) not viable: no known conversion from
      'std::__1::vector<int, std::__1::allocator<int> >::iterator' (aka '__wrap_iter<int *>') to 'const
      std::__1::iterator<std::__1::random_access_iterator_tag, int, long, int *, int &> &' for 1st argument
struct _LIBCPP_TEMPLATE_VIS iterator
                            ^
/Applications/Xcode-9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:531:29: note: 
      candidate constructor (the implicit move constructor) not viable: no known conversion from
      'std::__1::vector<int, std::__1::allocator<int> >::iterator' (aka '__wrap_iter<int *>') to
      'std::__1::iterator<std::__1::random_access_iterator_tag, int, long, int *, int &> &&' for 1st argument
1 error generated.

还有其他我不知道的通用迭代器类具有此功能吗?

1 个答案:

答案 0 :(得分:1)

std::iterator不是迭代器,它的存在是为了简化定义。它是由实现定义的,因此标准容器的迭代器是否从中派生,这就是为什么赋值可以在编译器上工作的原因。

  

还有其他我不知道的通用迭代器类具有此功能吗?

不。 C ++的方式是编写模板,例如

template <typename Iterator>
int dereference(Iterator it) { return *it; }