无法从一种迭代器类型转换为另一种,但两者完全相同

Posted

技术标签:

【中文标题】无法从一种迭代器类型转换为另一种,但两者完全相同【英文标题】:Cannot convert from one iterator type to another but both are the exact same 【发布时间】:2011-11-28 23:46:15 【问题描述】:

我正在尝试编译 ZipStream 库,它实际上是 zlib 的 C++ 包装器。

现在我正处于这两行出现两个编译错误的地步:

std::set<file_info_32*, sort_by_offset>::iterator first  = _core->_entries_by_name.begin();
std::set<file_info_32*, sort_by_offset>::iterator last   = _core->_entries_by_name.end();

错误是:

错误 15 错误 C2440:'initializing':无法从'std::_Tree_const_iterator&lt;_Mytree&gt;' 转换为'std::_Tree_const_iterator&lt;_Mytree&gt;' c:\users\ahakeem\desktop\zipstream\ziparchive.cpp 423 1 zipstream 错误 16 错误 C2440:'initializing':无法从'std::_Tree_const_iterator&lt;_Mytree&gt;' 转换为'std::_Tree_const_iterator&lt;_Mytree&gt;' c:\users\ahakeem\desktop\zipstream\ziparchive.cpp 424 1 zipstream

所以基本上编译器说它不能从'std::_Tree_const_iterator&lt;_Mytree&gt;' 转换为'std::_Tree_const_iterator&lt;_Mytree&gt;'

任何想法为什么会发生以及如何解决?

编辑:经过进一步调查,我发现_core-&gt;entries_by_name.begin() 被声明为'std::set&lt;file_info_32*, sort_by_offset&gt;',这显然与其迭代器试图分配给的内容不一致(std::set&lt;file_info_32*, sort_by_offset&gt;)。

将其切换为 _core-&gt;_entries_by_offset.begin(); 有效,因为 _entries_by_offset 是与受让人期望获得的类型一致的类型。

这是否意味着有人可能已经破坏了代码,没有意识到并将其上传到源代码库?或者这种错误分配的场景实际上可以在某些系统上编译吗?

【问题讨论】:

常量正确性?看看你是否能找到错误的非常量。 或者他们是不同的_Mytrees @ildjarn 我确定我没有粘贴错误的错误,这是我在编译时遇到的两个编译错误,如果有影响,我会在我的问题中添加更多内容。 你可能有一个过时的编译器/库,所以它不知道 iterator 和 const_iterator 是常量迭代器,和/或它不提供转换。 @Gene : VC++ 2010 的标准库实现非常可靠,所以我认为这在这里不相关,但总的来说是个好建议。 【参考方案1】:

我的最佳猜测是,替换 _MyTree 的类是不同的。

在错误下方的输出中查找with _MyTree = SomeClass

【讨论】:

以上是关于无法从一种迭代器类型转换为另一种,但两者完全相同的主要内容,如果未能解决你的问题,请参考以下文章

在java中将日期从一种格式转换为另一种格式[重复]

通过重新解释原始字节从一种类型的 numpy 数组转换为另一种类型

将字符串从一种编码转换为另一种编码

向量从一种类型到另一种c ++的隐式转换

在不了解文化的情况下将月份名称从一种语言转换为另一种语言?

C 强制类型转换