【发布时间】:2010-04-21 18:23:08
【问题描述】:
#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:错误:'__result.std::insert_iterator::operator* 中的 'operator=' 不匹配 [with _Container = std::set, std::分配器 >]() = __first.std::_List_iterator::operator* [with _Tp = std::basic_string, std::allocator >]()'
...我解释说需要的赋值运算符没有定义。我查看了 insert_iterator 的源代码,并注意到它重载了赋值运算符。复制算法必须使用插入迭代器重载赋值运算符来完成它的工作(?)。
我猜是因为我的输入迭代器在一个字符串容器上,而我的输出迭代器在一个 MyContainers 容器上,所以重载的 insert_iterator 赋值运算符不能再工作了。
这是我最好的猜测,但我可能错了。
那么,为什么这不起作用,我该如何完成我想要做的事情?
【问题讨论】: