我的问题是关于标准库中的enable_if
谓词,但我会在迭代器类型的上下文中构建它,因为这是我目前遇到此问题的地方。
我有一个自定义迭代器类型It
,因此std::iterator_traits<It>::value_type
是Val
。我已经成功地使用了这种类型的前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位编译器。
答案 0 :(得分:0)
您的编译器将尝试告诉您哪个参数错误。 Visual Studio将告诉您最符合您规范的重载以及匹配或不匹配的参数。我相信Clang和gcc也这样做。
一旦你读了不匹配的参数,你就有责任确定编译器是否尝试了正确的重载,以及你的参数是如何匹配的。
在大多数情况下,这非常简单。但是你适合迭代器它可能有点令人生畏。但这就是为什么这通常是通过你的样板来自iterator
的继承来处理的。
当您编写迭代器时,您有责任实现从中继承的迭代器类别的要求。
insert
要求最后两个参数为“InputIterators”。所以你应该继承自iterator<input_iterator_tag, T>
或其中一个更加费劲的标签。 “InputIterator”定义为:
reference
和value_type
成员类型