Нет перегруженного оператора = отображается в алгоритме.cpp

Я работаю с set_union (включен в algorithm.cpp) и устанавливает в библиотеке STL.

Мои наборы содержат объекты пользовательского класса Vertex, в который я перегрузил operator =

Вот класс Vertex:

class Vertex {
public:
City city;
bool wasVisited;
Vertex() {};
Vertex(City c) {city = c; wasVisited = false;}
double getWeightToVertex(Vertex v) {return city.getWeightWith(v.city);}
Vertex& operator=(const Vertex&v) {
if(this == &v)
return *this;
city = v.city;
return *this;
}
};

Проблема заключается в следующих строках, включенных в метод другого класса.

for(int i=0; i<nEdges; i++) {
Edge e = edges[i];
Vertex start = vertexList[e.start];
Vertex end = vertexList[e.end];
if(sets[e.start].find(vertexList[e.end]) == sets[e.start].end()) { // The two vertices do not belong to the same set
//Add the edge to our MST
MST[nValidEdges] = e;
nValidEdges++;
//Get the union of vertex sets and insert it
//in the corresponding place in the dynamic array
set<Vertex> unionSet;
set_union(sets[e.start].begin(), sets[e.start].end(), sets[e.end].begin(), sets[e.end].end(), unionSet.begin());
sets[e.start] = unionSet;
}
}

Этот код генерирует ошибку компиляции вgorithm.cpp, более конкретно в коде set_union, где говорится, что нет жизнеспособного перегруженного оператора = для двух объектов типа «InputIterator».

Вот местоположение ошибки компилятора:

template <class _InputIterator, class _OutputIterator>
inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
for (; __first != __last; ++__first, ++__result)
*__result = *__first; //Error Here: No Viable Overloaded '='
return __result;
}

Что мне здесь не хватает?

1

Решение

Помимо совершенно прослушивается Vertex::operator= (которую можно просто удалить) причина вашей ошибки в том, что вам нужно обернуть unionSet во вставку.

set_union(sets[e.start].begin(),
sets[e.start].end(),
sets[e.end].begin(),
sets[e.end].end(),
inserter(unionSet, unionSet.begin()));

Функции как set_union overate в режиме «перезаписи», то есть они перезаписывают существующие элементы контейнера, в который вы пишете. Если вы хотите добавить элементы в пустой контейнер, вы должны использовать адаптер, такой как вставка.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]