我的类型在std函数中失败了enable_if谓词。有没有办法“调试”谓词?

时间:2016-05-04 12:22:45

标签: c++ iterator enable-if

我的问题是关于标准库中的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>标头,我发现失败的enable_if谓词是_Is_Iterator。有没有办法逐步通过谓词条件找出哪一个It没有满足,或者通常有任何方法找出这些信息而无需手动检查InputIterator的所有要求(或其他相关的概念可能是一个接一个?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

  1. 满足“Iterator
  2. 所有要求的类型
  3. EquallyComparable
  4. 的类型
  5. 定义了referencevalue_type成员类型
  6. 定义了不等式运算符
  7. 指定了指针取消引用和成员选择运算符
  8. 定义了预增量和后增量运算符