Что бы сработало, было бы использовать конструктор (который имел бы больше смысла вместо присваивания):
class MyContainer {
public:
string value;
MyContainer(const string& s): value(s) {
}
};
Тогда вторая проблема заключается в том, что множество также требует, чтобы его содержимое было сопоставимым.
Что касается причины, insert_iterator
работает с перегрузкой operator=
:
insert_iterator<Container>& operator= (typename Container::const_reference value);
Как видите, правое значение должно быть либо типом значения контейнера, либо неявно преобразованным в него,это именно то, чего достигает (не явный) конструктор, а оператор присваивания - нет.
Технически вы также можете заставить его работать без изменения класса (например, если вы не хотите(явный конструктор), предоставляя подходящую функцию преобразования:
MyContainer from_string(const std::string& s)
{
MyContainer m;
m = s; //or any other method how to turn a string into MyContainer
return m;
}
, которую можно использовать с std::transform
:
transform(strings.begin(), strings.end(), inserter(containers, containers.end()), from_string);