auto it = vector.begin() 结果类型不可转换为 const_iterator

2023-12-04

容器需要提供iterator可以隐式转换为的类型const_iterator。鉴于此,我正在尝试使用auto通过初始化一个对象vector::begin(),并使用该结果对象std::distance其中 RHS 是const_iterator。这不起作用。这是一个完整的例子:

#include <cstdlib>
#include <vector>
#include <iterator>
#include <iostream>

typedef std::vector <char> Packet;
typedef std::vector <Packet> Packets;

template <typename Iter> 
Iter next_upto (Iter begin, Iter end, size_t n)
{
    Iter ret = begin;
      for (; n > 0 && ret != end; ++ret, --n)
            ;   
        return ret;
}

Packets::const_iterator Process (Packets::const_iterator begin, Packets::const_iterator end)
{
  Packets::const_iterator ret = begin;
  while (ret != end)
    ++ret;  // do something
  return ret;
}

int main()
{
  Packets test (100); // vector of 100 default-initialized packets

  // process them 10 at a time
  for (auto it = test.begin();
    it != test.end();
    it = next_upto (it, test.end(), 10))
  {
     auto itr = Process (it, next_upto (it, test.end(), 10));
     Packets::const_iterator it2 = it; 
     const size_t n1 = std::distance (it2, itr);
     const size_t n = std::distance (it, itr);
     std::cout << "Processed " << n << " packets\n";
  }
}

在 g++ 4.8.1(和 4.8.2)下编译会产生:

[1/2] Building CXX object CMakeFiles/hacks.dir/main.o
FAILED: /usr/bin/g++    -Wall -std=c++11 -g -MMD -MT CMakeFiles/hacks.dir/main.o -MF "CMakeFiles/hacks.dir/main.o.d" -o CMakeFiles/hacks.dir/main.o -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:39:45: error: no matching function for call to ‘distance(__gnu_cxx::__normal_iterator<std::vector<char>*, std::vector<std::vector<char> > >&, __gnu_cxx::__normal_iterator<const std::vector<char>*, std::vector<std::vector<char> > >&)’
      const size_t n = std::distance (it, itr);
                                             ^
main.cpp:39:45: note: candidate is:
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:66:0,
                 from /usr/include/c++/4.8/vector:60,
                 from main.cpp:2:
/usr/include/c++/4.8/bits/stl_iterator_base_funcs.h:114:5: note: template<class _InputIterator> typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator)
     distance(_InputIterator __first, _InputIterator __last)
     ^
/usr/include/c++/4.8/bits/stl_iterator_base_funcs.h:114:5: note:   template argument deduction/substitution failed:
main.cpp:39:45: note:   deduced conflicting types for parameter ‘_InputIterator’ (‘__gnu_cxx::__normal_iterator<std::vector<char>*, std::vector<std::vector<char> > >’ and ‘__gnu_cxx::__normal_iterator<const std::vector<char>*, std::vector<std::vector<char> > >’)
      const size_t n = std::distance (it, itr);
                                             ^

我知道我可以通过调用来修复这个特定的实例cbegin() and cend()而不是begin() and end(), 但是由于begin() and end()返回一个应该可以转换为的类型const_iterator,我不确定我是否理解为什么需要这样做。

为什么auto在这种情况下推导出一个不可转换为的类型const_iterator?


您的问题可以简化为以下示例,该示例由于相同的原因而失败。

#include <vector>
#include <iterator>
int main()
{
    std::vector<int> v;
    std::vector<int>::const_iterator it1 = v.begin();
    auto it2 = v.end();
    auto n = std::distance(it1, it2);
}

std::distance两个参数使用相同的模板参数类型定义,并且模板参数推导失败,因为您有一个const_iterator and iterator.

从函数调用推导模板参数时,不考虑用户定义的转换,并且由于在这种情况下两个参数具有不同的类型,并且两者都参与模板参数推导,因此推导失败。

§14.8.1/6 [临时参数.显式]

如果参数类型不包含任何内容,则会对函数参数执行隐式转换(第 4 条),将其转换为相应函数参数的类型。模板参数参与模板参数推导。

§14.8.2.1/4 [温度超过]

... [ Note:根据14.8.1中的规定,如果函数参数不包含任何参数,则会对函数参数执行隐式转换,将其转换为相应函数参数的类型模板参数参与模板参数推导。除了前面列表中描述的转换之外,还允许进行此类转换。——尾注 ]

您需要将iterator to const_iterator,或指定模板参数std::distance明确地。

auto n = std::distance(it1, static_cast<decltype(it1)>(it2));

or

auto n = std::distance<decltype(it1)>(it1, it2);

当然,其他选项是不使用auto并在两种情况下显式指定迭代器类型,或者使用vector::cbegin() and vector::cend()当您需要确保类型是成员函数时const_iterator.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

auto it = vector.begin() 结果类型不可转换为 const_iterator 的相关文章

随机推荐

  • 阻止滚动函数多次触发?

    所以我有一个脚本 可以从数据库中提取数据并在用户接近页面底部时显示它 问题 当用户到达底部时 脚本应该只返回一个帖子 但实际上 正在发出多个请求 导致所有帖子都被快速从数据库中提取 这反过来又以错误的方式返回它们命令 我的问题是 有没有人知
  • 使用 open() 或 creat() 创建文件的权限位设置比我要求的要少

    我正在编写一个程序来模仿 cp 实用程序 但是 我无法获得文件权限以正常工作 我知道它们存储在结构中stat并存储在st mode场与stat 我的问题是我没有获得组或其他类别的写入权限 即我得到 rwxr xr x作为文件的权限 即使源文
  • Java 8 流的 toArray 和 size 参数

    我想知道stream toArray x gt new Integer x 如何知道数组的大小 我写了一个片段 其中创建了一个大小为 4 的整数列表并过滤了值 它创建了一个过滤流长度的数组 我在流上看不到任何方法来获取流的大小 List
  • 使用 Aforge.Net 将灰度图像转换为黑白图像

    我对 Aforge Net 很陌生 我正在寻找一种将灰度图像转换为黑白图像的方法 我真的找不到任何支持吗 我设法通过应用灰度滤镜将普通图像转换为灰度图像 但我找不到任何有关黑白转换的信息 有人可以帮我一下吗 使用阈值类别将图像转换为黑白图像
  • Java applet 在 Web 上的可用性

    对于我们大学的电子学习项目 我们使用 Java 小程序在 Ilias 学习单元内显示一些交互式内容 例如一些交互式函数绘图或一些简单的问答系统或其他交互式元素以及这些元素的任意组合 我们决定使用 Java 因为我们想要一个开放的解决方案 当
  • Git:使一个分支与另一个分支完全相同

    我对 Git 比较陌生 而且仍然不太适应 现在 我正在寻找可以使当前分支看起来像另一个分支的命令 选项 魔法 也就是说 合并它们 但当出现冲突时 始终选择要合并到当前分支中的差异 我的情况是这样的 我在 master 分支上有一个稳定的应用
  • d3js 动态 csv 从下拉列表切换

    我是 d3js 的新手 我在这里成功使用了示例 https gist github com d3noob 4414436 这非常好 因为它可以远程工作 CSV 存储在服务器端 现在 我想更进一步 添加从列表中选择源 CSV 并重新绘制图表的
  • # 和 ## 运算符在 C 中做什么? [复制]

    这个问题在这里已经有答案了 类似 NAME 或 NAME 它们在C中是什么意思 我在关于宏的 GCC 文档中看到了它们 运算符 连接两个参数 它们之间不留空格 define printe a b a b printe c out lt lt
  • 动态导入 JavaScript

    请问将 JavaScript js 文件动态导入父 JavaScript 代码的正确方法是什么 我正在使用以下代码 但它似乎不正确 function loadjscssfile filename filetype if filename i
  • 类型错误:“图像”对象不可使用 PIL 进行下标

    我正在尝试在 google colab 上开发一个网络应用程序 我想在这个 Web 应用程序中使用我之前训练过的模型制作一个图像分类器 当我在 Web 应用程序中从浏览器中选择要分类的图像时 出现以下错误 TypeError Image o
  • 从 NSMutable 字典中分离键和对象,并使用 sqlite 的插入命令中的值

    大家好 我正在 iPhone 中开发一个 sqlite 应用程序 因为我是这个应用程序的新手 所以我不知道如何在 sqlite 的插入语句命令中使用 NSMutableDictionary 中的键和对象 例如 我想要以下格式的插入语句 插入
  • 直接在javascript函数中调用C#方法

    如何在 javascript 函数中直接调用 C 方法 例如page load页面后面代码的方法 请帮我 要在客户端事件上调用服务器端方法 您需要执行以下操作 1 创建服务器端方法 void DoSomething 2 实施System W
  • 如何从 Perl 脚本运行“source”命令(Linux)?

    我在尝试着source来自 Perl 脚本 script pl 的脚本 system source some generic script 请注意 这个通用脚本可以是 shell python 或任何其他脚本 另外 我无法将这个通用脚本中存
  • ElasticSearch 5.x 上下文建议器 NEST .Net

    我正在尝试使用 ElasticSearch 5 1 2 上的 Nest 5 0 创建一个带有上下文建议器的索引 目前 我可以创建映射 elasticClient MapAsync
  • 在 Java 8 中查找列表的最大值、最小值、总和和平均值

    如何在Java 8中找到以下列表中数字的最大值 最小值 总和和平均值 List
  • 本地主机上的 Angular2 CORS 问题[重复]

    这个问题在这里已经有答案了 Failed to load URL Response to preflight request doesn t pass access control check No Access Control Allow
  • 当许多客户端连接时,我的 socket.io 服务器开始随机断开客户端连接(由于“ping 超时”原因)

    我正在构建一个网站 我的客户端通过网络套接字与服务器进行通信 我在后端使用 Nodejs 因此使用著名的 socket io 库进行 Web 套接字通信 问题 1 到 40 个客户端一切正常 之后服务器开始随机断开客户端连接 一开始我认为这
  • 运行时添加到DAG的任务无法调度

    我的想法是有一个任务foo它生成输入列表 用户 报告 日志文件等 并为输入列表中的每个元素启动一个任务 目标是利用 Airflow 的重试和其他逻辑 而不是重新实现它 So ideally my DAG should look someth
  • 使用vba检查网络连接

    有没有办法在vba中检查网络连接 我正在使用这个命令 If Dir O Then MsgBox you have network connection Else MsgBox No Connection End If 但它不起作用 我收到运
  • auto it = vector.begin() 结果类型不可转换为 const_iterator

    容器需要提供iterator可以隐式转换为的类型const iterator 鉴于此 我正在尝试使用auto通过初始化一个对象vector begin 并使用该结果对象std distance其中 RHS 是const iterator 这