Двоичный '=': не найден оператор, который принимает левый операнд типа 'const Thing' - PullRequest
0 голосов
/ 09 марта 2019

Я прочитал дубликаты, но на самом деле мне это не помогло.

Я пытаюсь достичь следующего поведения. Наличие вектора, состоящего из пар {Thing, set < Thing >} Я хочу конечный результат {Thing, newSetOfThing < Thing >} где это 'newSetOfThing' - это разница, применяемая с каждым другим устанавливает в векторе кроме себя. Разница означает наличие всех значений, но содержащихся в других наборах. Я использую std::set_difference.

Приведу более близкий пример с числами.

vector = {[1, {3,4,5,7}], [2,{1,3,9}], [3, {1,2,12}]};

==>

vectorResult = {[1, {4,5,7}], [2, {9}], [3, {2,12} } 

Тогда мой код выглядит так:

class Thing {
public:
    Thing () {
    };
    ~Thing () {};
    int position; //id
    bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Thing) const
{
  return(Other.position<position);
}

//The original vector
vector<pair<Thing, set<Thing>>> pairWithSet;

// I fill vector here [...]

// variable I define to store partial results
set<Thing> differenceResult;
// Vector I want to fill for results
vector<pair<Thing, set<Thing>>> newPairWithSet;

// Operation 
for (pair<Thing, set<Thing>> currentPair : pairWithSet){
    Thing currentThing= currentPair.first;
    differenceResult = currentPair.second;
    for (int i=0; i<pairWithSet.size();i++) {
       if (pairWithSet[i].first.position != currentThing.position) {
    set_difference(differenceResult.begin(),
                   differenceResult.end(),
                   pairWithSet[i].second.begin(),
                   pairWithSet[i].second.end(),
                   differenceResult.begin());
}
         newPairWithSet.push_back(pair<Thing, set<Thing>>(currentThing, differenceResult));
}

Я объясняю мою цель, чтобы у вас была точка, откуда идти, но в конце я думаю, что проблема больше связана с тем, насколько неправильно я использую операцию set_difference и что я не могу напрямую назначить 'Thing'. Поэтому set_difference не может проверить, совпадают ли они. Потому что ошибка

binary '=': не найден оператор, который принимает левый операнд типа 'Const Thing' (или нет приемлемого преобразования

Я говорю, потому что, возможно, существуют другие ошибки для определения поведения, поскольку я все еще не могу отладить, пока не решу проблему с оператором.

У меня вопрос, нужно ли мне объявить эту операцию '=' и как. Или если я что-то пропустил и мне нужно выступить другим способом

Я могу убедиться, что проблема в том, что я использую set_difference. Если я прокомментирую эту часть, компилятор выполнит задачу:

 set_difference(differenceResult.begin(),
                       differenceResult.end(),
                       pairWithSet[i].second.begin(),
                       pairWithSet[i].second.end(),
                       differenceResult.begin());

И я думаю, это потому, что в конце он пытается выполнить присвоение const (потому что std::pair объявление?), Так как оно говорит об ошибке (тогда, очевидно, компилятор не знает, как работать). Поэтому я не понимаю, как выполнить это рекурсивно set_difference.

1 Ответ

1 голос
/ 09 марта 2019

set_difference записывает результаты в место, указанное его 5-м аргументом.Вы передаете differenceResult.begin() что не так, потому что begin для set всегда возвращает const iterator .Вы не можете выполнить операцию записи, когда местом назначения является объект, указанный константным итератором.

Если вы хотите сохранить Thing объекты в set как результат алгоритма set_difference, вы можете использовать std::inserter:

        set<Thing> res;  // CREATE EMPTY SET
        set_difference(differenceResult.begin(),
          differenceResult.end(),
          pairWithSet[i].second.begin(),
          pairWithSet[i].second.end(),
          std::inserter(res,res.begin())); // CREATE INSERT_ITERATOR WHICH INSERTS THINGS INTO RES

, затем вы можете скопировать res в newPairWithSet.

...