それらは多くのアルゴリズムにあいまいさをもたらします。多くのように<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とMSVC10は最初の関数を呼び出します。
コメントで非常に長い議論をした後、これが期待どおりに機能しない1つの例です。述語としても使用できるコンテナーアダプターを使用します。
#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