Я пытаюсь скомпилировать проект VC6 с VC10... Я получаю ошибку C2678 с set_intersection: Я записал некоторый пример для понимания. Кто-либо может объяснить, как скомпилировать это отрывки?
#include <vector>
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
int main( )
{
using namespace std;
typedef set<string> MyType;
MyType in1, in2, out;
MyType::iterator out_iter(out.begin());
set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), out_iter);
}
Вывод:
c:\program files\microsoft visual\studio 10.0\vc\include\algorithm (4494): ошибка C2678: '=' двоичный файл: никакой оператор не определил, который берет левый операнд типа 'станд. константы:: basic_string <_Elem, _Traits, _Ax>' (или нет никакого приемлемого преобразования),
Если я использую a std::vector
вместо std::set
за компиляцией следуют. приемлемый)
попытка
set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), inserter(out, out.begin()) );
Это происходит потому, что set_intersection хочет записать в выходной итератор, что приводит к увеличению размера выходного контейнера. Однако это невозможно сделать с помощью одного лишь итератора (его можно использовать для перезаписи существующих элементов, но не для увеличения размера)
Редактирование: исправил опечатку. Используйте инсертер для добавления к множеству. Обратный_инсертер работает только для векторов и тому подобного.
Редактирование 2: исправлена еще одна опечатка. STL inserter
требует второй аргумент, который является итератором подсказки к вероятной позиции вставки. Спасибо chepseskaf.