我只是试图构建一个涉及通用迭代器类型的东西,特别是一些链接迭代器的东西,但是我无法取消引用迭代器。 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.
还有其他我不知道的通用迭代器类具有此功能吗?
答案 0 :(得分:1)
std::iterator
不是迭代器,它的存在是为了简化定义。它是由实现定义的,因此标准容器的迭代器是否从中派生,这就是为什么赋值可以在编译器上工作的原因。
还有其他我不知道的通用迭代器类具有此功能吗?
不。 C ++的方式是编写模板,例如
template <typename Iterator>
int dereference(Iterator it) { return *it; }