#include <list>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;
class MyContainer {
public:
string value;
MyContainer& operator=(const string& s) {
this->value = s;
return *this;
}
};
int main()
{
list<string> strings;
strings.push_back("0");
strings.push_back("1");
strings.push_back("2");
set<MyContainer> containers;
copy(strings.begin(), strings.end(), inserter(containers, containers.end()));
}
Предыдущий код не компилируется. В стандартном стиле C++ вывод ошибок многословен и сложен для понимания. Ключевая часть, кажется, это...
/usr/include/c++/4.4/bits/stl_algobase.h:313: error: no match for ‘operator=’ in ‘__result.std::insert_iterator::operator* [with _Container = std::set, std::allocator >]() = __first.std::_List_iterator::operator* [with _Tp = std::basic_string, std::allocator >]()’
... что я интерпретирую, чтобы означать, что необходимый оператор присваивания не определен. Я взглянул на исходный код для insert_iterator и заметил, что он перегружает оператор присваивания. Алгоритм копирования должен использовать перегруженный оператор присваивания итераторов вставки для выполнения своей работы (?).
Я предполагаю, что, поскольку мой итератор ввода находится в контейнере строк, а мой итератор вывода находится в контейнере MyContainers, перегруженный оператор присваивания insert_iterator больше не может работать.
Это мое лучшее предположение, но я, вероятно, ошибаюсь.
Итак, почему именно это не работает и как я могу выполнить то, что пытаюсь сделать?