Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 无法取消引用泛型迭代器类型_C++11_Iterator - Fatal编程技术网

C++11 无法取消引用泛型迭代器类型

C++11 无法取消引用泛型迭代器类型,c++11,iterator,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_it

我只是试图构建一些涉及泛型迭代器类型的东西,特别是一些链接迭代器的东西,但是我不能取消对迭代器的引用。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;
}
#包括
#包括
#包括
int main(){
std::向量a={1};
std::iterator my_iterator=a.begin();
int my_int=*my_迭代器;
返回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.
iterator.cxx:6:57:错误:没有从“std::\uu 1::vector::iterator”进行有效转换
(又名“uuu wrap_iter”)到“std::iterator”
std::iterator my_iterator=a.begin();
^             ~~~~~~~~~
/Applications/Xcode-9.4.1.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/c++/v1/iterator:531:29:注意:
候选构造函数(隐式副本构造函数)不可行:没有从
“std::_1::vector::iterator”(又名“_wrap_iter”)到“const”
std::_1::迭代器&'用于第一个参数
结构LIBCPP模板VIS迭代器
^
/Applications/Xcode-9.4.1.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/c++/v1/iterator:531:29:注意:
候选构造函数(隐式移动构造函数)不可行:没有从
“std::_u1::vector::iterator”(又名“_wrap_iter”)到
第一个参数的“std::_1::迭代器&”
生成1个错误。

是否还有其他一些我不知道的泛型迭代器类具有此功能?

std::iterator
不是迭代器,它是定义迭代器的缩写。如果标准容器的迭代器是从它派生的,则它是实现定义的,这就是赋值在编译器上工作的原因

是否有其他我不知道的通用迭代器类具有此功能

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

template <typename Iterator>
int dereference(Iterator it) { return *it; }
模板
int解引用(迭代器it){return*it;}

问题不是从解引用开始的,而是从
my\u迭代器的初始化开始的
std::vector::iterator
(由
a.begin()
返回)与
std::iterator
不兼容。如果我想同时使用
std::map::iterator
std::vector::iterator
怎么办?不应该有基类吗?不,没有。所有的标准迭代器类型都是与它们的容器绑定的,没有共同的基础。如果你做出解释,我可以把它变成一个答案。如果你想在C++中使用泛型,你就必须使用模板。请注意,所有处理范围的标准库函数都是如何使用迭代器模板的。例如,见。该函数可用于任何类型的容器,如向量、映射、集合或deques。