gpt4 book ai didi

c++ - 我的类型在 std 函数中未能通过 enable_if 谓词。有没有办法 "debug"谓词?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:37 27 4
gpt4 key购买 nike

我的问题是关于 enable_if通常标准库中的谓词,但我将在迭代器类型的上下文中构建它,因为这是我目前遇到此问题的地方。

我有一个自定义迭代器类型 It , 这样 std::iterator_traits<It>::value_typeVal .我一直在使用 C++11 之前的标准成功地使用这种类型,但现在使用 C++11(以及另一个通常更严格的编译器)编译失败。我的一个用例是 insert into a vector喜欢

std::vector<Val> v; 
It begin = ...
It end = ...
v.insert(v.end(), begin, end);

编译器拒绝特定重载候选的原因 insert<_Iter>(iterator, _Iter, _Iter)我想要的是:

no matching member function for call to 'insert'
candidate template ignored: disabled by 'enable_if' [with _Iter = It]

查看 <vector> header ,我看到失败的 enable_if谓词是 _Is_Iterator .有没有办法通过谓词条件找出哪个It不满足,或者通常没有任何方法可以在不需要手动检查 InputIterator 的所有要求的情况下找到此信息(或任何相关概念)一个一个?

旧编译器(It 适用)是bcc32来自 C++ Builder XE8;新的编译器是 C++ Builder 10.1 中基于 Clang 的 32 位编译器。

最佳答案

您的编译器会尝试告诉您哪个参数错误。 Visual Studio 会告诉您最符合您的规范的重载以及哪些参数匹配或不匹配。我相信 Clang 和 gcc 也会这样做。

一旦您读取了不匹配的参数,您就有责任确定编译器是否尝试了正确的重载,以及您的参数如何不匹配。

在大多数情况下,这是非常简单的。但是您适合迭代器,这可能有点令人生畏。但这就是为什么这通常是通过继承 iterator 来处理的。通过您的样板文件。

当您编写迭代器时,您有责任实现您从中继承的迭代器类别的要求。

insert 要求最后两个参数为“InputIterators”。所以你应该继承自 iterator<input_iterator_tag, T>或更费力的标签之一。 “InputIterator”定义为:

  1. 满足“Iterator”所有要求的类型
  2. 类型为“EquallyComparable
  3. referencevalue_type定义成员类型
  4. 定义不等式
  5. 定义了指针解引用和成员选择运算符
  6. 定义了前置和后置运算符

关于c++ - 我的类型在 std 函数中未能通过 enable_if 谓词。有没有办法 "debug"谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027712/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com