它们确实为许多算法引入了歧义。很多<algorithm>
样子
template<class iterator>
void do_something(iterator, iterator);
template<class iterator, class funct>
void do_something(iterator, iterator, funct);
如果添加额外的重载
template<class container, class funct>
void do_something(container, funct);
编译器将很难弄清楚是什么do_something(x, y)
意思。如果x
和y
相同type
,它将同时匹配iterator = type
和container = type, funct = type
。*)
C++11 试图用能够识别容器和迭代器之间区别的“概念”来解决这个问题。然而,事实证明这些“概念”过于复杂,无法将其纳入标准,因此这些重载也没有。
*) 编译器在这里不同意,Comeau 编译器声称它是模棱两可的,g++ 4.5 和 MSVC 10 调用第一个函数。
在评论中进行了非常长时间的讨论之后,这是一个无法按预期工作的示例 - 使用也可以兼作谓词的容器适配器。
#include <iostream>
#include <vector>
template<class iterator>
void test(iterator, iterator)
{
std::cout << "test iterator\n";
}
template<class iterator, class predicate>
void test(iterator, iterator, predicate)
{
std::cout << "test iterator, predicate\n";
}
template<class container, class predicate>
void test(const container& cont, predicate compare)
{
std::cout << "test container, predicate\n";
test(cont.begin(), cont.end(), compare);
}
template<class container>
class adapter
{
public:
typedef typename container::iterator iterator;
adapter(container* cont) : cont(cont)
{ }
iterator begin() const
{ return cont->begin(); }
iterator end() const
{ return cont->end(); }
bool operator()(const iterator& one, const iterator& two)
{ return *one < *two; }
private:
container* cont;
};
int main()
{
std::vector<int> v;
adapter<std::vector<int>> a(&v);
test(a, a);
}
输出:
测试迭代器
http://ideone.com/wps2tZ